diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 33f3633766..b610592700 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,7 +2,11 @@ CHANGELOG ========= -====== +1.11.3dev +========= + +* feature: Local Mode: Add support for Batch Inference + 1.11.2 ====== @@ -10,7 +14,6 @@ CHANGELOG * enhancement: Local Mode: accept short lived credentials with a warning message * bug-fix: Local Mode: pass in job name as parameter for training environment variable -======= 1.11.1 ====== diff --git a/README.rst b/README.rst index ce9e9e99bb..26f0472644 100644 --- a/README.rst +++ b/README.rst @@ -226,6 +226,27 @@ Here is an end-to-end example: predictor.delete_endpoint() +If you don't want to deploy your model locally, you can also choose to perform a Local Batch Transform Job. This is +useful if you want to test your container before creating a Sagemaker Batch Transform Job. Note that the performance +will not match Batch Transform Jobs hosted on SageMaker but it is still a useful tool to ensure you have everything +right or if you are not dealing with huge amounts of data. + +Here is an end-to-end example: + +.. code:: python + + from sagemaker.mxnet import MXNet + + mxnet_estimator = MXNet('train.py', + train_instance_type='local', + train_instance_count=1) + + mxnet_estimator.fit('file:///tmp/my_training_data') + transformer = mxnet_estimator.transformer(1, 'local', assemble_with='Line', max_payload=1) + transformer.transform('s3://my/transform/data, content_type='text/csv', split_type='Line') + transformer.wait() + + For detailed examples of running Docker in local mode, see: - `TensorFlow local mode example notebook `__. diff --git a/src/sagemaker/amazon/common.py b/src/sagemaker/amazon/common.py index c15f6e344b..e15cc09a4d 100644 --- a/src/sagemaker/amazon/common.py +++ b/src/sagemaker/amazon/common.py @@ -153,7 +153,7 @@ def write_spmatrix_to_sparse_tensor(file, array, labels=None): def read_records(file): """Eagerly read a collection of amazon Record protobuf objects from file.""" records = [] - for record_data in _read_recordio(file): + for record_data in read_recordio(file): record = Record() record.ParseFromString(record_data) records.append(record) @@ -183,7 +183,7 @@ def _write_recordio(f, data): f.write(padding[pad]) -def _read_recordio(f): +def read_recordio(f): while(True): try: read_kmagic, = struct.unpack('I', f.read(4)) diff --git a/src/sagemaker/local/data.py b/src/sagemaker/local/data.py new file mode 100644 index 0000000000..6c90467233 --- /dev/null +++ b/src/sagemaker/local/data.py @@ -0,0 +1,380 @@ +# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You +# may not use this file except in compliance with the License. A copy of +# the License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file 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. +from __future__ import absolute_import + +import os +import sys +import tempfile +from abc import ABCMeta +from abc import abstractmethod +from six import with_metaclass + +from six.moves.urllib.parse import urlparse + +import sagemaker.amazon.common +import sagemaker.local.utils +import sagemaker.utils + + +def get_data_source_instance(data_source, sagemaker_session): + """Return an Instance of :class:`sagemaker.local.data.DataSource` that can handle + the provided data_source URI. + + data_source can be either file:// or s3:// + + Args: + data_source (str): a valid URI that points to a data source. + sagemaker_session (:class:`sagemaker.session.Session`): a SageMaker Session to interact with + S3 if required. + + Returns + :class:`sagemaker.local.data.DataSource`: an Instance of a Data Source + + """ + parsed_uri = urlparse(data_source) + if parsed_uri.scheme == 'file': + return LocalFileDataSource(parsed_uri.path) + elif parsed_uri.scheme == 's3': + return S3DataSource(parsed_uri.netloc, parsed_uri.path, sagemaker_session) + + +def get_splitter_instance(split_type): + """Return an Instance of :class:`sagemaker.local.data.Splitter` according to + the specified `split_type`. + + Args: + split_type (str): either 'Line' or 'RecordIO'. Can be left as None to signal no data split + will happen. + + Returns + :class:`sagemaker.local.data.Splitter`: an Instance of a Splitter + """ + if split_type is None: + return NoneSplitter() + elif split_type == 'Line': + return LineSplitter() + elif split_type == 'RecordIO': + return RecordIOSplitter() + else: + raise ValueError('Invalid Split Type: %s' % split_type) + + +def get_batch_strategy_instance(strategy, splitter): + """Return an Instance of :class:`sagemaker.local.data.BatchStrategy` according to `strategy` + + Args: + strategy (str): Either 'SingleRecord' or 'MultiRecord' + splitter (:class:`sagemaker.local.data.Splitter): splitter to get the data from. + + Returns + :class:`sagemaker.local.data.BatchStrategy`: an Instance of a BatchStrategy + """ + if strategy == 'SingleRecord': + return SingleRecordStrategy(splitter) + elif strategy == 'MultiRecord': + return MultiRecordStrategy(splitter) + else: + raise ValueError('Invalid Batch Strategy: %s - Valid Strategies: "SingleRecord", "MultiRecord"') + + +class DataSource(with_metaclass(ABCMeta, object)): + + @abstractmethod + def get_file_list(self): + """Retrieve the list of absolute paths to all the files in this data source. + + Returns: + List[str]: List of absolute paths. + """ + pass + + @abstractmethod + def get_root_dir(self): + """Retrieve the absolute path to the root directory of this data source. + + Returns: + str: absolute path to the root directory of this data source. + """ + pass + + +class LocalFileDataSource(DataSource): + """Represents a data source within the local filesystem. + """ + + def __init__(self, root_path): + self.root_path = os.path.abspath(root_path) + if not os.path.exists(self.root_path): + raise RuntimeError('Invalid data source: %s does not exist.' % self.root_path) + + def get_file_list(self): + """Retrieve the list of absolute paths to all the files in this data source. + + Returns: + List[str] List of absolute paths. + """ + if os.path.isdir(self.root_path): + return [os.path.join(self.root_path, f) for f in os.listdir(self.root_path) + if os.path.isfile(os.path.join(self.root_path, f))] + else: + return [self.root_path] + + def get_root_dir(self): + """Retrieve the absolute path to the root directory of this data source. + + Returns: + str: absolute path to the root directory of this data source. + """ + if os.path.isdir(self.root_path): + return self.root_path + else: + return os.path.dirname(self.root_path) + + +class S3DataSource(DataSource): + """Defines a data source given by a bucket and S3 prefix. The contents will be downloaded + and then processed as local data. + """ + + def __init__(self, bucket, prefix, sagemaker_session): + """Create an S3DataSource instance + + Args: + bucket (str): S3 bucket name + prefix (str): S3 prefix path to the data + sagemaker_session (:class:`sagemaker.session.Session`): a sagemaker_session with the desired settings + to talk to S3 + """ + + # Create a temporary dir to store the S3 contents + root_dir = sagemaker.utils.get_config_value('local.container_root', sagemaker_session.config) + if root_dir: + root_dir = os.path.abspath(root_dir) + + working_dir = tempfile.mkdtemp(dir=root_dir) + sagemaker.utils.download_folder(bucket, prefix, working_dir, sagemaker_session) + self.files = LocalFileDataSource(working_dir) + + def get_file_list(self): + """Retrieve the list of absolute paths to all the files in this data source. + + Returns: + List[str]: List of absolute paths. + """ + return self.files.get_file_list() + + def get_root_dir(self): + """Retrieve the absolute path to the root directory of this data source. + + Returns: + str: absolute path to the root directory of this data source. + """ + return self.files.get_root_dir() + + +class Splitter(with_metaclass(ABCMeta, object)): + + @abstractmethod + def split(self, file): + """Split a file into records using a specific strategy + + Args: + file (str): path to the file to split + + Returns: + generator for the individual records that were split from the file + """ + pass + + +class NoneSplitter(Splitter): + """Does not split records, essentially reads the whole file. + """ + + def split(self, file): + """Split a file into records using a specific strategy. + + For this NoneSplitter there is no actual split happening and the file is returned + as a whole. + + Args: + file (str): path to the file to split + + Returns: generator for the individual records that were split from the file + """ + with open(file, 'r') as f: + yield f.read() + + +class LineSplitter(Splitter): + """Split records by new line. + """ + + def split(self, file): + """Split a file into records using a specific strategy + + This LineSplitter splits the file on each line break. + + Args: + file (str): path to the file to split + + Returns: generator for the individual records that were split from the file + """ + with open(file, 'r') as f: + for line in f: + yield line + + +class RecordIOSplitter(Splitter): + """Split using Amazon Recordio. + + Not useful for string content. + + """ + def split(self, file): + """Split a file into records using a specific strategy + + This RecordIOSplitter splits the data into individual RecordIO records. + + Args: + file (str): path to the file to split + + Returns: generator for the individual records that were split from the file + """ + with open(file, 'rb') as f: + for record in sagemaker.amazon.common.read_recordio(f): + yield record + + +class BatchStrategy(with_metaclass(ABCMeta, object)): + + def __init__(self, splitter): + """Create a Batch Strategy Instance + + Args: + splitter (:class:`sagemaker.local.data.Splitter`): A Splitter to pre-process the data + before batching. + """ + self.splitter = splitter + + @abstractmethod + def pad(self, file, size): + """Group together as many records as possible to fit in the specified size + + Args: + file (str): file path to read the records from. + size (int): maximum size in MB that each group of records will be fitted to. + passing 0 means unlimited size. + + Returns: + generator of records + """ + pass + + +class MultiRecordStrategy(BatchStrategy): + """Feed multiple records at a time for batch inference. + + Will group up as many records as possible within the payload specified. + """ + def __init__(self, splitter): + """Create a MultiRecordStrategy Instance + + Args: + splitter (:class:`sagemaker.local.data.Splitter`): A Splitter to pre-process the data + before batching. + """ + super(MultiRecordStrategy, self).__init__(splitter) + + def pad(self, file, size=6): + """Group together as many records as possible to fit in the specified size + + Args: + file (str): file path to read the records from. + size (int): maximum size in MB that each group of records will be fitted to. + passing 0 means unlimited size. + + Returns: + generator of records + """ + buffer = '' + for element in self.splitter.split(file): + if _payload_size_within_limit(buffer + element, size): + buffer += element + else: + tmp = buffer + buffer = element + yield tmp + if _validate_payload_size(buffer, size): + yield buffer + + +class SingleRecordStrategy(BatchStrategy): + """Feed a single record at a time for batch inference. + + If a single record does not fit within the payload specified it will throw a RuntimeError. + """ + def __init__(self, splitter): + """Create a SingleRecordStrategy Instance + + Args: + splitter (:class:`sagemaker.local.data.Splitter`): A Splitter to pre-process the data + before batching. + """ + super(SingleRecordStrategy, self).__init__(splitter) + + def pad(self, file, size=6): + """Group together as many records as possible to fit in the specified size + + This SingleRecordStrategy will not group any record and will return them one by one as + long as they are within the maximum size. + + Args: + file (str): file path to read the records from. + size (int): maximum size in MB that each group of records will be fitted to. + passing 0 means unlimited size. + + Returns: + generator of records + """ + for element in self.splitter.split(file): + if _validate_payload_size(element, size): + yield element + + +def _payload_size_within_limit(payload, size): + size_in_bytes = size * 1024 * 1024 + if size == 0: + return True + else: + return sys.getsizeof(payload) < size_in_bytes + + +def _validate_payload_size(payload, size): + """Check if a payload is within the size in MB threshold. Raise an exception otherwise. + + Args: + payload: data that will be checked + size (int): max size in MB + + Returns: + bool: True if within bounds. if size=0 it will always return True + + Raises: + RuntimeError: If the payload is larger a runtime error is thrown. + """ + + if _payload_size_within_limit(payload, size): + return True + else: + raise RuntimeError('Record is larger than %sMB. Please increase your max_payload' % size) diff --git a/src/sagemaker/local/entities.py b/src/sagemaker/local/entities.py index a67c14acb1..199db7d5cb 100644 --- a/src/sagemaker/local/entities.py +++ b/src/sagemaker/local/entities.py @@ -13,11 +13,16 @@ from __future__ import absolute_import import datetime +import json import logging +import os +import tempfile import time import urllib3 +import sagemaker.local.data from sagemaker.local.image import _SageMakerContainer +from sagemaker.local.utils import copy_directory_structure, move_to_destination from sagemaker.utils import get_config_value logger = logging.getLogger(__name__) @@ -76,6 +81,227 @@ def describe(self): return response +class _LocalTransformJob(object): + + _CREATING = 'Creating' + _COMPLETED = 'Completed' + + def __init__(self, transform_job_name, model_name, local_session=None): + from sagemaker.local import LocalSession + self.local_session = local_session or LocalSession() + local_client = self.local_session.sagemaker_client + + self.name = transform_job_name + self.model_name = model_name + + # TODO - support SageMaker Models not just local models. This is not + # ideal but it may be a good thing to do. + self.primary_container = local_client.describe_model(model_name)['PrimaryContainer'] + self.container = None + self.start_time = None + self.end_time = None + self.batch_strategy = None + self.environment = {} + self.state = _LocalTransformJob._CREATING + + def start(self, input_data, output_data, transform_resources, **kwargs): + """Start the Local Transform Job + + Args: + input_data (dict): Describes the dataset to be transformed and the location where it is stored. + output_data (dict): Identifies the location where to save the results from the transform job + transform_resources (dict): compute instances for the transform job. Currently only supports local or + local_gpu + **kwargs: additional arguments coming from the boto request object + """ + self.transform_resources = transform_resources + self.input_data = input_data + self.output_data = output_data + + image = self.primary_container['Image'] + instance_type = transform_resources['InstanceType'] + instance_count = 1 + + environment = self._get_container_environment(**kwargs) + + # Start the container, pass the environment and wait for it to start up + self.container = _SageMakerContainer(instance_type, instance_count, image, self.local_session) + self.container.serve(self.primary_container['ModelDataUrl'], environment) + + serving_port = get_config_value('local.serving_port', self.local_session.config) or 8080 + _wait_for_serving_container(serving_port) + + # Get capabilities from Container if needed + endpoint_url = 'http://localhost:%s/execution-parameters' % serving_port + response, code = _perform_request(endpoint_url) + if code == 200: + execution_parameters = json.loads(response.read()) + # MaxConcurrentTransforms is ignored because we currently only support 1 + for setting in ('BatchStrategy', 'MaxPayloadInMB'): + if setting not in kwargs and setting in execution_parameters: + kwargs[setting] = execution_parameters[setting] + + # Apply Defaults if none was provided + kwargs.update(self._get_required_defaults(**kwargs)) + + self.start_time = datetime.datetime.now() + self.batch_strategy = kwargs['BatchStrategy'] + if 'Environment' in kwargs: + self.environment = kwargs['Environment'] + + # run the batch inference requests + self._perform_batch_inference(input_data, output_data, **kwargs) + self.end_time = datetime.datetime.now() + self.state = self._COMPLETED + + def describe(self): + """Describe this _LocalTransformJob + + The response is a JSON-like dictionary that follows the response of the + boto describe_transform_job() API. + + Returns: + dict: description of this _LocalTransformJob + """ + response = { + 'TransformJobStatus': self.state, + 'ModelName': self.model_name, + 'TransformJobName': self.name, + 'TransformJobArn': _UNUSED_ARN, + 'TransformEndTime': self.end_time, + 'CreationTime': self.start_time, + 'TransformStartTime': self.start_time, + 'Environment': {}, + 'BatchStrategy': self.batch_strategy, + } + + if self.transform_resources: + response['TransformResources'] = self.transform_resources + + if self.output_data: + response['TransformOutput'] = self.output_data + + if self.input_data: + response['TransformInput'] = self.input_data + + return response + + def _get_container_environment(self, **kwargs): + """Get all the Environment variables that will be passed to the container + + Certain input fields such as BatchStrategy have different values for the API vs the Environment + variables, such as SingleRecord vs SINGLE_RECORD. This method also handles this conversion. + + Args: + **kwargs: existing transform arguments + + Returns: + dict: All the environment variables that should be set in the container + + """ + environment = {} + environment.update(self.primary_container['Environment']) + environment['SAGEMAKER_BATCH'] = 'True' + if 'MaxPayloadInMB' in kwargs: + environment['SAGEMAKER_MAX_PAYLOAD_IN_MB'] = str(kwargs['MaxPayloadInMB']) + + if 'BatchStrategy' in kwargs: + if kwargs['BatchStrategy'] == 'SingleRecord': + strategy_env_value = 'SINGLE_RECORD' + elif kwargs['BatchStrategy'] == 'MultiRecord': + strategy_env_value = 'MULTI_RECORD' + else: + raise ValueError('Invalid BatchStrategy, must be \'SingleRecord\' or \'MultiRecord\'') + environment['SAGEMAKER_BATCH_STRATEGY'] = strategy_env_value + + # we only do 1 max concurrent transform in Local Mode + if 'MaxConcurrentTransforms' in kwargs and int(kwargs['MaxConcurrentTransforms']) > 1: + logger.warning('Local Mode only supports 1 ConcurrentTransform. Setting MaxConcurrentTransforms to 1') + environment['SAGEMAKER_MAX_CONCURRENT_TRANSFORMS'] = '1' + + # if there were environment variables passed to the Transformer we will pass them to the + # container as well. + if 'Environment' in kwargs: + environment.update(kwargs['Environment']) + return environment + + def _get_required_defaults(self, **kwargs): + """Return the default values for anything that was not provided by either the user or the container + + Args: + **kwargs: current transform arguments + + Returns: + dict: key/values for the default parameters that are missing. + """ + defaults = {} + if 'BatchStrategy' not in kwargs: + defaults['BatchStrategy'] = 'MultiRecord' + + if 'MaxPayloadInMB' not in kwargs: + defaults['MaxPayloadInMB'] = 6 + + return defaults + + def _get_working_directory(self): + # Root dir to use for intermediate data location. To make things simple we will write here regardless + # of the final destination. At the end the files will either be moved or uploaded to S3 and deleted. + root_dir = get_config_value('local.container_root', self.local_session.config) + if root_dir: + root_dir = os.path.abspath(root_dir) + + working_dir = tempfile.mkdtemp(dir=root_dir) + return working_dir + + def _prepare_data_transformation(self, input_data, batch_strategy): + input_path = input_data['DataSource']['S3DataSource']['S3Uri'] + data_source = sagemaker.local.data.get_data_source_instance(input_path, self.local_session) + + split_type = input_data['SplitType'] if 'SplitType' in input_data else None + splitter = sagemaker.local.data.get_splitter_instance(split_type) + + batch_provider = sagemaker.local.data.get_batch_strategy_instance(batch_strategy, splitter) + return data_source, batch_provider + + def _perform_batch_inference(self, input_data, output_data, **kwargs): + # Transform the input data to feed the serving container. We need to first gather the files + # from S3 or Local FileSystem. Split them as required (Line, RecordIO, None) and finally batch them + # according to the batch strategy and limit the request size. + + batch_strategy = kwargs['BatchStrategy'] + max_payload = int(kwargs['MaxPayloadInMB']) + data_source, batch_provider = self._prepare_data_transformation(input_data, batch_strategy) + + # Output settings + accept = output_data['Accept'] if 'Accept' in output_data else None + + working_dir = self._get_working_directory() + dataset_dir = data_source.get_root_dir() + + for file in data_source.get_file_list(): + + relative_path = os.path.dirname(os.path.relpath(file, dataset_dir)) + filename = os.path.basename(file) + copy_directory_structure(working_dir, relative_path) + destination_path = os.path.join(working_dir, relative_path, filename + '.out') + + with open(destination_path, 'wb') as f: + for item in batch_provider.pad(file, max_payload): + # call the container and add the result to inference. + response = self.local_session.sagemaker_runtime_client.invoke_endpoint( + item, '', input_data['ContentType'], accept) + + response_body = response['Body'] + data = response_body.read().strip() + response_body.close() + f.write(data) + if 'AssembleWith' in output_data and output_data['AssembleWith'] == 'Line': + f.write(b'\n') + + move_to_destination(working_dir, output_data['S3OutputPath'], self.local_session) + self.container.stop_serving() + + class _LocalModel(object): def __init__(self, model_name, primary_container): @@ -143,29 +369,10 @@ def serve(self): self.container = _SageMakerContainer(instance_type, instance_count, image, self.local_session) self.container.serve(self.primary_container['ModelDataUrl'], self.primary_container['Environment']) - i = 0 - http = urllib3.PoolManager() serving_port = get_config_value('local.serving_port', self.local_session.config) or 8080 - endpoint_url = 'http://localhost:%s/ping' % serving_port - while True: - i += 1 - if i >= HEALTH_CHECK_TIMEOUT_LIMIT: - self.state = _LocalEndpoint._FAILED - raise RuntimeError('Giving up, endpoint: %s didn\'t launch correctly' % self.name) - - logger.info('Checking if endpoint is up, attempt: %s' % i) - try: - r = http.request('GET', endpoint_url) - if r.status != 200: - logger.info('Container still not up, got: %s' % r.status) - else: - # the container is running and it passed the healthcheck status is now InService - self.state = _LocalEndpoint._IN_SERVICE - return - except urllib3.exceptions.RequestError: - logger.info('Container still not up') - - time.sleep(1) + _wait_for_serving_container(serving_port) + # the container is running and it passed the healthcheck status is now InService + self.state = _LocalEndpoint._IN_SERVICE def stop(self): if self.container: @@ -181,3 +388,33 @@ def describe(self): 'EndpointStatus': self.state } return response + + +def _wait_for_serving_container(serving_port): + i = 0 + http = urllib3.PoolManager() + + endpoint_url = 'http://localhost:%s/ping' % serving_port + while True: + i += 1 + if i >= HEALTH_CHECK_TIMEOUT_LIMIT: + raise RuntimeError('Giving up, endpoint didn\'t launch correctly') + + logger.info('Checking if serving container is up, attempt: %s' % i) + response, code = _perform_request(endpoint_url, http) + if code != 200: + logger.info('Container still not up, got: %s' % code) + else: + return + + time.sleep(1) + + +def _perform_request(endpoint_url, pool_manager=None): + http = pool_manager or urllib3.PoolManager() + try: + r = http.request('GET', endpoint_url) + code = r.status + except urllib3.exceptions.RequestError: + return None, -1 + return r, code diff --git a/src/sagemaker/local/image.py b/src/sagemaker/local/image.py index 1a845b38f6..58e8d7c637 100644 --- a/src/sagemaker/local/image.py +++ b/src/sagemaker/local/image.py @@ -33,7 +33,6 @@ import yaml import sagemaker -from sagemaker.utils import get_config_value CONTAINER_PREFIX = 'algo' DOCKER_COMPOSE_FILENAME = 'docker-compose.yaml' @@ -217,9 +216,9 @@ def retrieve_artifacts(self, compose_data): for volume in volumes: host_dir, container_dir = volume.split(':') if container_dir == '/opt/ml/model': - self._recursive_copy(host_dir, s3_model_artifacts) + sagemaker.local.utils.recursive_copy(host_dir, s3_model_artifacts) elif container_dir == '/opt/ml/output': - self._recursive_copy(host_dir, s3_output_artifacts) + sagemaker.local.utils.recursive_copy(host_dir, s3_output_artifacts) return s3_model_artifacts @@ -252,49 +251,6 @@ def write_config_files(self, host, hyperparameters, input_data_config): _write_json_file(os.path.join(config_path, 'resourceconfig.json'), resource_config) _write_json_file(os.path.join(config_path, 'inputdataconfig.json'), json_input_data_config) - def _recursive_copy(self, src, dst): - for root, dirs, files in os.walk(src): - root = os.path.relpath(root, src) - current_path = os.path.join(src, root) - target_path = os.path.join(dst, root) - - for file in files: - shutil.copy(os.path.join(current_path, file), os.path.join(target_path, file)) - for dir in dirs: - new_dir = os.path.join(target_path, dir) - if not os.path.exists(new_dir): - os.mkdir(os.path.join(target_path, dir)) - - def _download_folder(self, bucket_name, prefix, target): - boto_session = self.sagemaker_session.boto_session - - s3 = boto_session.resource('s3') - bucket = s3.Bucket(bucket_name) - - for obj_sum in bucket.objects.filter(Prefix=prefix): - # if obj_sum is a folder object skip it. - if obj_sum.key != '' and obj_sum.key[-1] == '/': - continue - obj = s3.Object(obj_sum.bucket_name, obj_sum.key) - s3_relative_path = obj_sum.key[len(prefix):].lstrip('/') - file_path = os.path.join(target, s3_relative_path) - - try: - os.makedirs(os.path.dirname(file_path)) - except OSError as exc: - if exc.errno != errno.EEXIST: - raise - pass - obj.download_file(file_path) - - def _download_file(self, bucket_name, path, target): - path = path.lstrip('/') - boto_session = self.sagemaker_session.boto_session - - s3 = boto_session.resource('s3') - bucket = s3.Bucket(bucket_name) - bucket.download_file(path, target) - def _prepare_training_volumes(self, data_dir, input_data_config, hyperparameters): shared_dir = os.path.join(self.container_root, 'shared') model_dir = os.path.join(self.container_root, 'model') @@ -322,7 +278,7 @@ def _prepare_training_volumes(self, data_dir, input_data_config, hyperparameters if parsed_uri.scheme == 's3': bucket_name = parsed_uri.netloc - self._download_folder(bucket_name, key, channel_dir) + sagemaker.utils.download_folder(bucket_name, key, channel_dir, self.sagemaker_session) elif parsed_uri.scheme == 'file': path = parsed_uri.path volumes.append(_Volume(path, channel=channel_name)) @@ -356,7 +312,7 @@ def _prepare_serving_volumes(self, model_location): parsed_uri = urlparse(model_location) filename = os.path.basename(parsed_uri.path) tar_location = os.path.join(container_model_dir, filename) - self._download_file(parsed_uri.netloc, parsed_uri.path, tar_location) + sagemaker.utils.download_file(parsed_uri.netloc, parsed_uri.path, tar_location, self.sagemaker_session) if tarfile.is_tarfile(tar_location): with tarfile.open(tar_location) as tar: @@ -460,8 +416,8 @@ def _create_docker_host(self, host, environment, optml_subdirs, command, volumes } if command == 'serve': - serving_port = get_config_value('local.serving_port', - self.sagemaker_session.config) or 8080 + serving_port = sagemaker.utils.get_config_value('local.serving_port', + self.sagemaker_session.config) or 8080 host_config.update({ 'ports': [ '%s:8080' % serving_port @@ -471,7 +427,8 @@ def _create_docker_host(self, host, environment, optml_subdirs, command, volumes return host_config def _create_tmp_folder(self): - root_dir = get_config_value('local.container_root', self.sagemaker_session.config) + root_dir = sagemaker.utils.get_config_value('local.container_root', + self.sagemaker_session.config) if root_dir: root_dir = os.path.abspath(root_dir) diff --git a/src/sagemaker/local/local_session.py b/src/sagemaker/local/local_session.py index 157eaf9b40..8361e18dab 100644 --- a/src/sagemaker/local/local_session.py +++ b/src/sagemaker/local/local_session.py @@ -20,7 +20,8 @@ from botocore.exceptions import ClientError from sagemaker.local.image import _SageMakerContainer -from sagemaker.local.entities import _LocalEndpointConfig, _LocalEndpoint, _LocalModel, _LocalTrainingJob +from sagemaker.local.entities import (_LocalEndpointConfig, _LocalEndpoint, _LocalModel, + _LocalTrainingJob, _LocalTransformJob) from sagemaker.session import Session from sagemaker.utils import get_config_value @@ -38,6 +39,7 @@ class LocalSagemakerClient(object): """ _training_jobs = {} + _transform_jobs = {} _models = {} _endpoint_configs = {} _endpoints = {} @@ -49,10 +51,7 @@ def __init__(self, sagemaker_session=None): sagemaker_session (sagemaker.session.Session): a session to use to read configurations from, and use its boto client. """ - self.serve_container = None self.sagemaker_session = sagemaker_session or LocalSession() - self.s3_model_artifacts = None - self.created_endpoint = False def create_training_job(self, TrainingJobName, AlgorithmSpecification, InputDataConfig, OutputDataConfig, ResourceConfig, **kwargs): @@ -80,7 +79,7 @@ def describe_training_job(self, TrainingJobName): """Describe a local training job. Args: - TrainingJobName (str): Not used in this implmentation. + TrainingJobName (str): Training job name to describe. Returns: (dict) DescribeTrainingJob Response. @@ -91,6 +90,19 @@ def describe_training_job(self, TrainingJobName): else: return LocalSagemakerClient._training_jobs[TrainingJobName].describe() + def create_transform_job(self, TransformJobName, ModelName, TransformInput, TransformOutput, + TransformResources, **kwargs): + transform_job = _LocalTransformJob(TransformJobName, ModelName, self.sagemaker_session) + LocalSagemakerClient._transform_jobs[TransformJobName] = transform_job + transform_job.start(TransformInput, TransformOutput, TransformResources, **kwargs) + + def describe_transform_job(self, TransformJobName): + if TransformJobName not in LocalSagemakerClient._transform_jobs: + error_response = {'Error': {'Code': 'ValidationException', 'Message': 'Could not find local transform job'}} + raise ClientError(error_response, 'describe_transform_job') + else: + return LocalSagemakerClient._transform_jobs[TransformJobName].describe() + def create_model(self, ModelName, PrimaryContainer, *args, **kwargs): """Create a Local Model Object @@ -154,8 +166,14 @@ def __init__(self, config=None): def invoke_endpoint(self, Body, EndpointName, ContentType, Accept): url = "http://localhost:%s/invocations" % self.serving_port + headers = { + 'Content-type': ContentType + } + if Accept is not None: + headers['Accept'] = Accept + r = self.http.request('POST', url, body=Body, preload_content=False, - headers={'Content-type': ContentType, 'Accept': Accept}) + headers=headers) return {'Body': r, 'ContentType': Accept} diff --git a/src/sagemaker/local/utils.py b/src/sagemaker/local/utils.py new file mode 100644 index 0000000000..355c4f77d2 --- /dev/null +++ b/src/sagemaker/local/utils.py @@ -0,0 +1,79 @@ +# Copyright 2017-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You +# may not use this file except in compliance with the License. A copy of +# the License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file 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. +from __future__ import absolute_import + +import os +import shutil + +from six.moves.urllib.parse import urlparse + + +def copy_directory_structure(destination_directory, relative_path): + """Create all the intermediate directories required for relative_path to exist within destination_directory. + This assumes that relative_path is a directory located within root_dir. + + Examples: + destination_directory: /tmp/destination + relative_path: test/unit/ + + will create: /tmp/destination/test/unit + + Args: + destination_directory (str): root of the destination directory where the directory structure will be created. + relative_path (str): relative path that will be created within destination_directory + """ + full_path = os.path.join(destination_directory, relative_path) + if os.path.exists(full_path): + return + + os.makedirs(destination_directory, relative_path) + + +def move_to_destination(source, destination, sagemaker_session): + """move source to destination. Can handle uploading to S3 + + Args: + source (str): root directory to move + destination (str): file:// or s3:// URI that source will be moved to. + sagemaker_session (sagemaker.Session): a sagemaker_session to interact with S3 if needed + """ + parsed_uri = urlparse(destination) + if parsed_uri.scheme == 'file': + recursive_copy(source, parsed_uri.path) + elif parsed_uri.scheme == 's3': + bucket = parsed_uri.netloc + path = parsed_uri.path.strip('/') + sagemaker_session.upload_data(source, bucket, path) + else: + raise ValueError('Invalid destination URI, must be s3:// or file://, got: %s' % destination) + + shutil.rmtree(source) + + +def recursive_copy(source, destination): + """Similar to shutil.copy but the destination directory can exist. Existing files will be overriden. + Args: + source (str): source path + destination (str): destination path + """ + for root, dirs, files in os.walk(source): + root = os.path.relpath(root, source) + current_path = os.path.join(source, root) + target_path = os.path.join(destination, root) + + for file in files: + shutil.copy(os.path.join(current_path, file), os.path.join(target_path, file)) + for dir in dirs: + new_dir = os.path.join(target_path, dir) + if not os.path.exists(new_dir): + os.mkdir(os.path.join(target_path, dir)) diff --git a/src/sagemaker/transformer.py b/src/sagemaker/transformer.py index a9c17afdd0..b3bb1d2303 100644 --- a/src/sagemaker/transformer.py +++ b/src/sagemaker/transformer.py @@ -31,7 +31,7 @@ def __init__(self, model_name, instance_count, instance_type, strategy=None, ass instance_count (int): Number of EC2 instances to use. instance_type (str): Type of EC2 instance to use, for example, 'ml.c4.xlarge'. strategy (str): The strategy used to decide how to batch records in a single request (default: None). - Valid values: 'MULTI_RECORD' and 'SINGLE_RECORD'. + Valid values: 'MultiRecord' and 'SingleRecord'. assemble_with (str): How the output is assembled (default: None). Valid values: 'Line' or 'None'. output_path (str): S3 location for saving the transform result. If not specified, results are stored to a default bucket. @@ -96,7 +96,8 @@ def transform(self, data, data_type='S3Prefix', content_type=None, compression_t Valid values: 'None', 'Line', and 'RecordIO'. job_name (str): job name (default: None). If not specified, one will be generated. """ - if not data.startswith('s3://'): + local_mode = self.sagemaker_session.local_mode + if not local_mode and not data.startswith('s3://'): raise ValueError('Invalid S3 URI: {}'.format(data)) if job_name is not None: diff --git a/src/sagemaker/utils.py b/src/sagemaker/utils.py index f83c047cf2..c190987c31 100644 --- a/src/sagemaker/utils.py +++ b/src/sagemaker/utils.py @@ -12,10 +12,12 @@ # language governing permissions and limitations under the License. from __future__ import absolute_import +import errno +import os +import re import sys import time -import re from datetime import datetime from functools import wraps @@ -193,6 +195,67 @@ def secondary_training_status_message(job_description, prev_description): return '\n'.join(status_strs) +def download_folder(bucket_name, prefix, target, sagemaker_session): + """Download a folder from S3 to a local path + + Args: + bucket_name (str): S3 bucket name + prefix (str): S3 prefix within the bucket that will be downloaded. Can be a single file. + target (str): destination path where the downloaded items will be placed + sagemaker_session (:class:`sagemaker.session.Session`): a sagemaker session to interact with S3. + """ + boto_session = sagemaker_session.boto_session + + s3 = boto_session.resource('s3') + bucket = s3.Bucket(bucket_name) + + prefix = prefix.lstrip('/') + + # there is a chance that the prefix points to a file and not a 'directory' if that is the case + # we should just download it. + objects = list(bucket.objects.filter(Prefix=prefix)) + + if len(objects) > 0 and objects[0].key == prefix and prefix[-1] != '/': + s3.Object(bucket_name, prefix).download_file(os.path.join(target, os.path.basename(prefix))) + return + + # the prefix points to an s3 'directory' download the whole thing + for obj_sum in bucket.objects.filter(Prefix=prefix): + # if obj_sum is a folder object skip it. + if obj_sum.key != '' and obj_sum.key[-1] == '/': + continue + obj = s3.Object(obj_sum.bucket_name, obj_sum.key) + s3_relative_path = obj_sum.key[len(prefix):].lstrip('/') + file_path = os.path.join(target, s3_relative_path) + + try: + os.makedirs(os.path.dirname(file_path)) + except OSError as exc: + # EEXIST means the folder already exists, this is safe to skip + # anything else will be raised. + if exc.errno != errno.EEXIST: + raise + pass + obj.download_file(file_path) + + +def download_file(bucket_name, path, target, sagemaker_session): + """Download a Single File from S3 into a local path + + Args: + bucket_name (str): S3 bucket name + path (str): file path within the bucket + target (str): destination directory for the downloaded file. + sagemaker_session (:class:`sagemaker.session.Session`): a sagemaker session to interact with S3. + """ + path = path.lstrip('/') + boto_session = sagemaker_session.boto_session + + s3 = boto_session.resource('s3') + bucket = s3.Bucket(bucket_name) + bucket.download_file(path, target) + + class DeferredError(object): """Stores an exception and raises it at a later time anytime this object is accessed in any way. Useful to allow soft-dependencies on imports, diff --git a/tests/data/mxnet_mnist/transform/data.csv b/tests/data/mxnet_mnist/transform/data.csv index 6e1e7b899d..6624d3fbc7 100644 --- a/tests/data/mxnet_mnist/transform/data.csv +++ b/tests/data/mxnet_mnist/transform/data.csv @@ -1 +1,11 @@ 0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.294118E-01,7.254902E-01,6.235294E-01,5.921569E-01,2.352941E-01,1.411765E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.705883E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.450981E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,6.666667E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.627451E-01,4.470589E-01,2.823530E-01,4.470589E-01,6.392157E-01,8.901961E-01,9.960785E-01,8.823530E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.803922E-01,8.980393E-01,9.960785E-01,9.960785E-01,5.490196E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,6.666667E-02,2.588235E-01,5.490196E-02,2.627451E-01,2.627451E-01,2.627451E-01,2.313726E-01,8.235294E-02,9.254903E-01,9.960785E-01,4.156863E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.254902E-01,9.921569E-01,8.196079E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.627451E-02,9.137256E-01,1.000000E+00,3.254902E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.058824E-01,9.960785E-01,9.333334E-01,1.725490E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.313726E-01,9.764706E-01,9.960785E-01,2.431373E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,7.333333E-01,1.960784E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.529412E-02,8.039216E-01,9.725491E-01,2.274510E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.941177E-01,9.960785E-01,7.137255E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.941177E-01,9.843138E-01,9.411765E-01,2.235294E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,7.450981E-02,8.666667E-01,9.960785E-01,6.509804E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.176471E-02,7.960785E-01,9.960785E-01,8.588236E-01,1.372549E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.490196E-01,9.960785E-01,9.960785E-01,3.019608E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.215686E-01,8.784314E-01,9.960785E-01,4.509804E-01,3.921569E-03,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.392157E-01,9.490197E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,9.960785E-01,8.588236E-01,1.568628E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,8.117648E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00 +0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.294118E-01,7.254902E-01,6.235294E-01,5.921569E-01,2.352941E-01,1.411765E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.705883E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.450981E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,6.666667E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.627451E-01,4.470589E-01,2.823530E-01,4.470589E-01,6.392157E-01,8.901961E-01,9.960785E-01,8.823530E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.803922E-01,8.980393E-01,9.960785E-01,9.960785E-01,5.490196E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,6.666667E-02,2.588235E-01,5.490196E-02,2.627451E-01,2.627451E-01,2.627451E-01,2.313726E-01,8.235294E-02,9.254903E-01,9.960785E-01,4.156863E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.254902E-01,9.921569E-01,8.196079E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.627451E-02,9.137256E-01,1.000000E+00,3.254902E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.058824E-01,9.960785E-01,9.333334E-01,1.725490E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.313726E-01,9.764706E-01,9.960785E-01,2.431373E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,7.333333E-01,1.960784E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.529412E-02,8.039216E-01,9.725491E-01,2.274510E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.941177E-01,9.960785E-01,7.137255E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.941177E-01,9.843138E-01,9.411765E-01,2.235294E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,7.450981E-02,8.666667E-01,9.960785E-01,6.509804E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.176471E-02,7.960785E-01,9.960785E-01,8.588236E-01,1.372549E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.490196E-01,9.960785E-01,9.960785E-01,3.019608E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.215686E-01,8.784314E-01,9.960785E-01,4.509804E-01,3.921569E-03,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.392157E-01,9.490197E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,9.960785E-01,8.588236E-01,1.568628E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,8.117648E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00 +0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.294118E-01,7.254902E-01,6.235294E-01,5.921569E-01,2.352941E-01,1.411765E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.705883E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.450981E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,6.666667E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.627451E-01,4.470589E-01,2.823530E-01,4.470589E-01,6.392157E-01,8.901961E-01,9.960785E-01,8.823530E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.803922E-01,8.980393E-01,9.960785E-01,9.960785E-01,5.490196E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,6.666667E-02,2.588235E-01,5.490196E-02,2.627451E-01,2.627451E-01,2.627451E-01,2.313726E-01,8.235294E-02,9.254903E-01,9.960785E-01,4.156863E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.254902E-01,9.921569E-01,8.196079E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.627451E-02,9.137256E-01,1.000000E+00,3.254902E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.058824E-01,9.960785E-01,9.333334E-01,1.725490E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.313726E-01,9.764706E-01,9.960785E-01,2.431373E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,7.333333E-01,1.960784E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.529412E-02,8.039216E-01,9.725491E-01,2.274510E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.941177E-01,9.960785E-01,7.137255E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.941177E-01,9.843138E-01,9.411765E-01,2.235294E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,7.450981E-02,8.666667E-01,9.960785E-01,6.509804E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.176471E-02,7.960785E-01,9.960785E-01,8.588236E-01,1.372549E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.490196E-01,9.960785E-01,9.960785E-01,3.019608E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.215686E-01,8.784314E-01,9.960785E-01,4.509804E-01,3.921569E-03,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.392157E-01,9.490197E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,9.960785E-01,8.588236E-01,1.568628E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,8.117648E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00 +0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.294118E-01,7.254902E-01,6.235294E-01,5.921569E-01,2.352941E-01,1.411765E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.705883E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.450981E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,6.666667E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.627451E-01,4.470589E-01,2.823530E-01,4.470589E-01,6.392157E-01,8.901961E-01,9.960785E-01,8.823530E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.803922E-01,8.980393E-01,9.960785E-01,9.960785E-01,5.490196E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,6.666667E-02,2.588235E-01,5.490196E-02,2.627451E-01,2.627451E-01,2.627451E-01,2.313726E-01,8.235294E-02,9.254903E-01,9.960785E-01,4.156863E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.254902E-01,9.921569E-01,8.196079E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.627451E-02,9.137256E-01,1.000000E+00,3.254902E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.058824E-01,9.960785E-01,9.333334E-01,1.725490E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.313726E-01,9.764706E-01,9.960785E-01,2.431373E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,7.333333E-01,1.960784E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.529412E-02,8.039216E-01,9.725491E-01,2.274510E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.941177E-01,9.960785E-01,7.137255E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.941177E-01,9.843138E-01,9.411765E-01,2.235294E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,7.450981E-02,8.666667E-01,9.960785E-01,6.509804E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.176471E-02,7.960785E-01,9.960785E-01,8.588236E-01,1.372549E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.490196E-01,9.960785E-01,9.960785E-01,3.019608E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.215686E-01,8.784314E-01,9.960785E-01,4.509804E-01,3.921569E-03,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.392157E-01,9.490197E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,9.960785E-01,8.588236E-01,1.568628E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,8.117648E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00 +0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.294118E-01,7.254902E-01,6.235294E-01,5.921569E-01,2.352941E-01,1.411765E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.705883E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.450981E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,6.666667E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.627451E-01,4.470589E-01,2.823530E-01,4.470589E-01,6.392157E-01,8.901961E-01,9.960785E-01,8.823530E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.803922E-01,8.980393E-01,9.960785E-01,9.960785E-01,5.490196E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,6.666667E-02,2.588235E-01,5.490196E-02,2.627451E-01,2.627451E-01,2.627451E-01,2.313726E-01,8.235294E-02,9.254903E-01,9.960785E-01,4.156863E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.254902E-01,9.921569E-01,8.196079E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.627451E-02,9.137256E-01,1.000000E+00,3.254902E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.058824E-01,9.960785E-01,9.333334E-01,1.725490E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.313726E-01,9.764706E-01,9.960785E-01,2.431373E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,7.333333E-01,1.960784E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.529412E-02,8.039216E-01,9.725491E-01,2.274510E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.941177E-01,9.960785E-01,7.137255E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.941177E-01,9.843138E-01,9.411765E-01,2.235294E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,7.450981E-02,8.666667E-01,9.960785E-01,6.509804E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.176471E-02,7.960785E-01,9.960785E-01,8.588236E-01,1.372549E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.490196E-01,9.960785E-01,9.960785E-01,3.019608E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.215686E-01,8.784314E-01,9.960785E-01,4.509804E-01,3.921569E-03,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.392157E-01,9.490197E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,9.960785E-01,8.588236E-01,1.568628E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,8.117648E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00 +0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.294118E-01,7.254902E-01,6.235294E-01,5.921569E-01,2.352941E-01,1.411765E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.705883E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.450981E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,6.666667E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.627451E-01,4.470589E-01,2.823530E-01,4.470589E-01,6.392157E-01,8.901961E-01,9.960785E-01,8.823530E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.803922E-01,8.980393E-01,9.960785E-01,9.960785E-01,5.490196E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,6.666667E-02,2.588235E-01,5.490196E-02,2.627451E-01,2.627451E-01,2.627451E-01,2.313726E-01,8.235294E-02,9.254903E-01,9.960785E-01,4.156863E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.254902E-01,9.921569E-01,8.196079E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.627451E-02,9.137256E-01,1.000000E+00,3.254902E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.058824E-01,9.960785E-01,9.333334E-01,1.725490E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.313726E-01,9.764706E-01,9.960785E-01,2.431373E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,7.333333E-01,1.960784E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.529412E-02,8.039216E-01,9.725491E-01,2.274510E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.941177E-01,9.960785E-01,7.137255E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.941177E-01,9.843138E-01,9.411765E-01,2.235294E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,7.450981E-02,8.666667E-01,9.960785E-01,6.509804E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.176471E-02,7.960785E-01,9.960785E-01,8.588236E-01,1.372549E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.490196E-01,9.960785E-01,9.960785E-01,3.019608E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.215686E-01,8.784314E-01,9.960785E-01,4.509804E-01,3.921569E-03,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.392157E-01,9.490197E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,9.960785E-01,8.588236E-01,1.568628E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,8.117648E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00 +0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.294118E-01,7.254902E-01,6.235294E-01,5.921569E-01,2.352941E-01,1.411765E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.705883E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.450981E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,6.666667E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.627451E-01,4.470589E-01,2.823530E-01,4.470589E-01,6.392157E-01,8.901961E-01,9.960785E-01,8.823530E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.803922E-01,8.980393E-01,9.960785E-01,9.960785E-01,5.490196E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,6.666667E-02,2.588235E-01,5.490196E-02,2.627451E-01,2.627451E-01,2.627451E-01,2.313726E-01,8.235294E-02,9.254903E-01,9.960785E-01,4.156863E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.254902E-01,9.921569E-01,8.196079E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.627451E-02,9.137256E-01,1.000000E+00,3.254902E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.058824E-01,9.960785E-01,9.333334E-01,1.725490E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.313726E-01,9.764706E-01,9.960785E-01,2.431373E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,7.333333E-01,1.960784E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.529412E-02,8.039216E-01,9.725491E-01,2.274510E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.941177E-01,9.960785E-01,7.137255E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.941177E-01,9.843138E-01,9.411765E-01,2.235294E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,7.450981E-02,8.666667E-01,9.960785E-01,6.509804E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.176471E-02,7.960785E-01,9.960785E-01,8.588236E-01,1.372549E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.490196E-01,9.960785E-01,9.960785E-01,3.019608E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.215686E-01,8.784314E-01,9.960785E-01,4.509804E-01,3.921569E-03,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.392157E-01,9.490197E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,9.960785E-01,8.588236E-01,1.568628E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,8.117648E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00 +0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.294118E-01,7.254902E-01,6.235294E-01,5.921569E-01,2.352941E-01,1.411765E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.705883E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.450981E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,6.666667E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.627451E-01,4.470589E-01,2.823530E-01,4.470589E-01,6.392157E-01,8.901961E-01,9.960785E-01,8.823530E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.803922E-01,8.980393E-01,9.960785E-01,9.960785E-01,5.490196E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,6.666667E-02,2.588235E-01,5.490196E-02,2.627451E-01,2.627451E-01,2.627451E-01,2.313726E-01,8.235294E-02,9.254903E-01,9.960785E-01,4.156863E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.254902E-01,9.921569E-01,8.196079E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.627451E-02,9.137256E-01,1.000000E+00,3.254902E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.058824E-01,9.960785E-01,9.333334E-01,1.725490E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.313726E-01,9.764706E-01,9.960785E-01,2.431373E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,7.333333E-01,1.960784E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.529412E-02,8.039216E-01,9.725491E-01,2.274510E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.941177E-01,9.960785E-01,7.137255E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.941177E-01,9.843138E-01,9.411765E-01,2.235294E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,7.450981E-02,8.666667E-01,9.960785E-01,6.509804E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.176471E-02,7.960785E-01,9.960785E-01,8.588236E-01,1.372549E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.490196E-01,9.960785E-01,9.960785E-01,3.019608E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.215686E-01,8.784314E-01,9.960785E-01,4.509804E-01,3.921569E-03,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.392157E-01,9.490197E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,9.960785E-01,8.588236E-01,1.568628E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,8.117648E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00 +0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.294118E-01,7.254902E-01,6.235294E-01,5.921569E-01,2.352941E-01,1.411765E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.705883E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.450981E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,6.666667E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.627451E-01,4.470589E-01,2.823530E-01,4.470589E-01,6.392157E-01,8.901961E-01,9.960785E-01,8.823530E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.803922E-01,8.980393E-01,9.960785E-01,9.960785E-01,5.490196E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,6.666667E-02,2.588235E-01,5.490196E-02,2.627451E-01,2.627451E-01,2.627451E-01,2.313726E-01,8.235294E-02,9.254903E-01,9.960785E-01,4.156863E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.254902E-01,9.921569E-01,8.196079E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.627451E-02,9.137256E-01,1.000000E+00,3.254902E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.058824E-01,9.960785E-01,9.333334E-01,1.725490E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.313726E-01,9.764706E-01,9.960785E-01,2.431373E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,7.333333E-01,1.960784E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.529412E-02,8.039216E-01,9.725491E-01,2.274510E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.941177E-01,9.960785E-01,7.137255E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.941177E-01,9.843138E-01,9.411765E-01,2.235294E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,7.450981E-02,8.666667E-01,9.960785E-01,6.509804E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.176471E-02,7.960785E-01,9.960785E-01,8.588236E-01,1.372549E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.490196E-01,9.960785E-01,9.960785E-01,3.019608E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.215686E-01,8.784314E-01,9.960785E-01,4.509804E-01,3.921569E-03,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.392157E-01,9.490197E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,9.960785E-01,8.588236E-01,1.568628E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,8.117648E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00 +0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.294118E-01,7.254902E-01,6.235294E-01,5.921569E-01,2.352941E-01,1.411765E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.705883E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.450981E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,6.666667E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.627451E-01,4.470589E-01,2.823530E-01,4.470589E-01,6.392157E-01,8.901961E-01,9.960785E-01,8.823530E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.803922E-01,8.980393E-01,9.960785E-01,9.960785E-01,5.490196E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,6.666667E-02,2.588235E-01,5.490196E-02,2.627451E-01,2.627451E-01,2.627451E-01,2.313726E-01,8.235294E-02,9.254903E-01,9.960785E-01,4.156863E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.254902E-01,9.921569E-01,8.196079E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.627451E-02,9.137256E-01,1.000000E+00,3.254902E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.058824E-01,9.960785E-01,9.333334E-01,1.725490E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.313726E-01,9.764706E-01,9.960785E-01,2.431373E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,7.333333E-01,1.960784E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.529412E-02,8.039216E-01,9.725491E-01,2.274510E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.941177E-01,9.960785E-01,7.137255E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.941177E-01,9.843138E-01,9.411765E-01,2.235294E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,7.450981E-02,8.666667E-01,9.960785E-01,6.509804E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.176471E-02,7.960785E-01,9.960785E-01,8.588236E-01,1.372549E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.490196E-01,9.960785E-01,9.960785E-01,3.019608E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.215686E-01,8.784314E-01,9.960785E-01,4.509804E-01,3.921569E-03,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.392157E-01,9.490197E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,9.960785E-01,8.588236E-01,1.568628E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,8.117648E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00 +0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.294118E-01,7.254902E-01,6.235294E-01,5.921569E-01,2.352941E-01,1.411765E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.705883E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.450981E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,7.764707E-01,6.666667E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.627451E-01,4.470589E-01,2.823530E-01,4.470589E-01,6.392157E-01,8.901961E-01,9.960785E-01,8.823530E-01,9.960785E-01,9.960785E-01,9.960785E-01,9.803922E-01,8.980393E-01,9.960785E-01,9.960785E-01,5.490196E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,6.666667E-02,2.588235E-01,5.490196E-02,2.627451E-01,2.627451E-01,2.627451E-01,2.313726E-01,8.235294E-02,9.254903E-01,9.960785E-01,4.156863E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.254902E-01,9.921569E-01,8.196079E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,8.627451E-02,9.137256E-01,1.000000E+00,3.254902E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.058824E-01,9.960785E-01,9.333334E-01,1.725490E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.313726E-01,9.764706E-01,9.960785E-01,2.431373E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,7.333333E-01,1.960784E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,3.529412E-02,8.039216E-01,9.725491E-01,2.274510E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.941177E-01,9.960785E-01,7.137255E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.941177E-01,9.843138E-01,9.411765E-01,2.235294E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,7.450981E-02,8.666667E-01,9.960785E-01,6.509804E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.176471E-02,7.960785E-01,9.960785E-01,8.588236E-01,1.372549E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.490196E-01,9.960785E-01,9.960785E-01,3.019608E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,1.215686E-01,8.784314E-01,9.960785E-01,4.509804E-01,3.921569E-03,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,5.215687E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,2.392157E-01,9.490197E-01,9.960785E-01,9.960785E-01,2.039216E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,9.960785E-01,8.588236E-01,1.568628E-01,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,4.745098E-01,9.960785E-01,8.117648E-01,7.058824E-02,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00,0.000000E+00 diff --git a/tests/integ/test_local_mode.py b/tests/integ/test_local_mode.py index e16f734d82..f3816f8b97 100644 --- a/tests/integ/test_local_mode.py +++ b/tests/integ/test_local_mode.py @@ -366,3 +366,33 @@ def test_mxnet_local_data_local_script(): mx.delete_endpoint() time.sleep(5) fcntl.lockf(local_mode_lock, fcntl.LOCK_UN) + + +@pytest.mark.continuous_testing +def test_local_transform_mxnet(sagemaker_local_session, tmpdir): + data_path = os.path.join(DATA_DIR, 'mxnet_mnist') + script_path = os.path.join(data_path, 'mnist.py') + + mx = MXNet(entry_point=script_path, role='SageMakerRole', train_instance_count=1, + train_instance_type='ml.c4.xlarge', sagemaker_session=sagemaker_local_session) + + train_input = mx.sagemaker_session.upload_data(path=os.path.join(data_path, 'train'), + key_prefix='integ-test-data/mxnet_mnist/train') + test_input = mx.sagemaker_session.upload_data(path=os.path.join(data_path, 'test'), + key_prefix='integ-test-data/mxnet_mnist/test') + + with timeout(minutes=15): + mx.fit({'train': train_input, 'test': test_input}) + + transform_input_path = os.path.join(data_path, 'transform') + transform_input_key_prefix = 'integ-test-data/mxnet_mnist/transform' + transform_input = mx.sagemaker_session.upload_data(path=transform_input_path, + key_prefix=transform_input_key_prefix) + + output_path = 'file://%s' % (str(tmpdir)) + transformer = mx.transformer(1, 'local', assemble_with='Line', max_payload=1, + strategy='SingleRecord', output_path=output_path) + transformer.transform(transform_input, content_type='text/csv', split_type='Line') + transformer.wait() + + assert os.path.exists(os.path.join(str(tmpdir), 'data.csv.out')) diff --git a/tests/unit/test_common.py b/tests/unit/test_common.py index ae693a32e3..d27ffd0890 100644 --- a/tests/unit/test_common.py +++ b/tests/unit/test_common.py @@ -17,7 +17,7 @@ import pytest import itertools from scipy.sparse import coo_matrix -from sagemaker.amazon.common import (record_deserializer, write_numpy_to_dense_tensor, _read_recordio, +from sagemaker.amazon.common import (record_deserializer, write_numpy_to_dense_tensor, read_recordio, numpy_to_record_serializer, write_spmatrix_to_sparse_tensor) from sagemaker.amazon.record_pb2 import Record @@ -26,7 +26,7 @@ def test_serializer(): s = numpy_to_record_serializer() array_data = [[1.0, 2.0, 3.0], [10.0, 20.0, 30.0]] buf = s(np.array(array_data)) - for record_data, expected in zip(_read_recordio(buf), array_data): + for record_data, expected in zip(read_recordio(buf), array_data): record = Record() record.ParseFromString(record_data) assert record.features["values"].float64_tensor.values == expected @@ -36,7 +36,7 @@ def test_serializer_accepts_one_dimensional_array(): s = numpy_to_record_serializer() array_data = [1.0, 2.0, 3.0] buf = s(np.array(array_data)) - record_data = next(_read_recordio(buf)) + record_data = next(read_recordio(buf)) record = Record() record.ParseFromString(record_data) assert record.features["values"].float64_tensor.values == array_data @@ -57,7 +57,7 @@ def test_float_write_numpy_to_dense_tensor(): with tempfile.TemporaryFile() as f: write_numpy_to_dense_tensor(f, array) f.seek(0) - for record_data, expected in zip(_read_recordio(f), array_data): + for record_data, expected in zip(read_recordio(f), array_data): record = Record() record.ParseFromString(record_data) assert record.features["values"].float64_tensor.values == expected @@ -69,7 +69,7 @@ def test_float32_write_numpy_to_dense_tensor(): with tempfile.TemporaryFile() as f: write_numpy_to_dense_tensor(f, array) f.seek(0) - for record_data, expected in zip(_read_recordio(f), array_data): + for record_data, expected in zip(read_recordio(f), array_data): record = Record() record.ParseFromString(record_data) assert record.features["values"].float32_tensor.values == expected @@ -81,7 +81,7 @@ def test_int_write_numpy_to_dense_tensor(): with tempfile.TemporaryFile() as f: write_numpy_to_dense_tensor(f, array) f.seek(0) - for record_data, expected in zip(_read_recordio(f), array_data): + for record_data, expected in zip(read_recordio(f), array_data): record = Record() record.ParseFromString(record_data) assert record.features["values"].int32_tensor.values == expected @@ -94,7 +94,7 @@ def test_int_label(): with tempfile.TemporaryFile() as f: write_numpy_to_dense_tensor(f, array, label_data) f.seek(0) - for record_data, expected, label in zip(_read_recordio(f), array_data, label_data): + for record_data, expected, label in zip(read_recordio(f), array_data, label_data): record = Record() record.ParseFromString(record_data) assert record.features["values"].int32_tensor.values == expected @@ -108,7 +108,7 @@ def test_float32_label(): with tempfile.TemporaryFile() as f: write_numpy_to_dense_tensor(f, array, label_data) f.seek(0) - for record_data, expected, label in zip(_read_recordio(f), array_data, label_data): + for record_data, expected, label in zip(read_recordio(f), array_data, label_data): record = Record() record.ParseFromString(record_data) assert record.features["values"].int32_tensor.values == expected @@ -122,7 +122,7 @@ def test_float_label(): with tempfile.TemporaryFile() as f: write_numpy_to_dense_tensor(f, array, label_data) f.seek(0) - for record_data, expected, label in zip(_read_recordio(f), array_data, label_data): + for record_data, expected, label in zip(read_recordio(f), array_data, label_data): record = Record() record.ParseFromString(record_data) assert record.features["values"].int32_tensor.values == expected @@ -154,7 +154,7 @@ def test_dense_float_write_spmatrix_to_sparse_tensor(): with tempfile.TemporaryFile() as f: write_spmatrix_to_sparse_tensor(f, array) f.seek(0) - for record_data, expected_data, expected_keys in zip(_read_recordio(f), array_data, keys_data): + for record_data, expected_data, expected_keys in zip(read_recordio(f), array_data, keys_data): record = Record() record.ParseFromString(record_data) assert record.features["values"].float64_tensor.values == expected_data @@ -169,7 +169,7 @@ def test_dense_float32_write_spmatrix_to_sparse_tensor(): with tempfile.TemporaryFile() as f: write_spmatrix_to_sparse_tensor(f, array) f.seek(0) - for record_data, expected_data, expected_keys in zip(_read_recordio(f), array_data, keys_data): + for record_data, expected_data, expected_keys in zip(read_recordio(f), array_data, keys_data): record = Record() record.ParseFromString(record_data) assert record.features["values"].float32_tensor.values == expected_data @@ -184,7 +184,7 @@ def test_dense_int_write_spmatrix_to_sparse_tensor(): with tempfile.TemporaryFile() as f: write_spmatrix_to_sparse_tensor(f, array) f.seek(0) - for record_data, expected_data, expected_keys in zip(_read_recordio(f), array_data, keys_data): + for record_data, expected_data, expected_keys in zip(read_recordio(f), array_data, keys_data): record = Record() record.ParseFromString(record_data) assert record.features["values"].int32_tensor.values == expected_data @@ -201,7 +201,7 @@ def test_dense_int_spmatrix_to_sparse_label(): write_spmatrix_to_sparse_tensor(f, array, label_data) f.seek(0) for record_data, expected_data, expected_keys, label in zip( - _read_recordio(f), + read_recordio(f), array_data, keys_data, label_data @@ -223,7 +223,7 @@ def test_dense_float32_spmatrix_to_sparse_label(): write_spmatrix_to_sparse_tensor(f, array, label_data) f.seek(0) for record_data, expected_data, expected_keys, label in zip( - _read_recordio(f), + read_recordio(f), array_data, keys_data, label_data @@ -245,7 +245,7 @@ def test_dense_float64_spmatrix_to_sparse_label(): write_spmatrix_to_sparse_tensor(f, array, label_data) f.seek(0) for record_data, expected_data, expected_keys, label in zip( - _read_recordio(f), + read_recordio(f), array_data, keys_data, label_data @@ -281,7 +281,7 @@ def test_sparse_float_write_spmatrix_to_sparse_tensor(): with tempfile.TemporaryFile() as f: write_spmatrix_to_sparse_tensor(f, array) f.seek(0) - for record_data, expected_data, expected_keys in zip(_read_recordio(f), array_data, keys_data): + for record_data, expected_data, expected_keys in zip(read_recordio(f), array_data, keys_data): record = Record() record.ParseFromString(record_data) assert record.features["values"].float64_tensor.values == expected_data @@ -303,7 +303,7 @@ def test_sparse_float32_write_spmatrix_to_sparse_tensor(): with tempfile.TemporaryFile() as f: write_spmatrix_to_sparse_tensor(f, array) f.seek(0) - for record_data, expected_data, expected_keys in zip(_read_recordio(f), array_data, keys_data): + for record_data, expected_data, expected_keys in zip(read_recordio(f), array_data, keys_data): record = Record() record.ParseFromString(record_data) assert record.features["values"].float32_tensor.values == expected_data @@ -325,7 +325,7 @@ def test_sparse_int_write_spmatrix_to_sparse_tensor(): with tempfile.TemporaryFile() as f: write_spmatrix_to_sparse_tensor(f, array) f.seek(0) - for record_data, expected_data, expected_keys in zip(_read_recordio(f), array_data, keys_data): + for record_data, expected_data, expected_keys in zip(read_recordio(f), array_data, keys_data): record = Record() record.ParseFromString(record_data) assert record.features["values"].int32_tensor.values == expected_data diff --git a/tests/unit/test_image.py b/tests/unit/test_image.py index d959329b5e..874a48b97c 100644 --- a/tests/unit/test_image.py +++ b/tests/unit/test_image.py @@ -10,6 +10,7 @@ # 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. +# language governing permissions and limitations under the License. from __future__ import absolute_import import random @@ -219,8 +220,8 @@ def test_check_output(): @patch('sagemaker.local.image._stream_output') @patch('subprocess.Popen') @patch('sagemaker.local.image._SageMakerContainer._cleanup') -@patch('sagemaker.local.image._SageMakerContainer._download_folder') -def test_train(_download_folder, _cleanup, popen, _stream_output, LocalSession, +@patch('sagemaker.utils.download_folder') +def test_train(download_folder, _cleanup, popen, _stream_output, LocalSession, tmpdir, sagemaker_session): directories = [str(tmpdir.mkdir('container-root')), str(tmpdir.mkdir('data'))] @@ -233,8 +234,8 @@ def test_train(_download_folder, _cleanup, popen, _stream_output, LocalSession, sagemaker_container.train(INPUT_DATA_CONFIG, HYPERPARAMETERS, TRAINING_JOB_NAME) channel_dir = os.path.join(directories[1], 'b') - download_folder_calls = [call('my-own-bucket', 'prefix', channel_dir)] - _download_folder.assert_has_calls(download_folder_calls) + download_folder_calls = [call('my-own-bucket', 'prefix', channel_dir, sagemaker_session)] + download_folder.assert_has_calls(download_folder_calls) docker_compose_file = os.path.join(sagemaker_container.container_root, 'docker-compose.yaml') @@ -262,8 +263,8 @@ def test_train(_download_folder, _cleanup, popen, _stream_output, LocalSession, @patch('sagemaker.local.local_session.LocalSession') @patch('sagemaker.local.image._stream_output') @patch('sagemaker.local.image._SageMakerContainer._cleanup') -@patch('sagemaker.local.image._SageMakerContainer._download_folder') -def test_train_with_hyperparameters_without_job_name(_download_folder, _cleanup, _stream_output, LocalSession, tmpdir): +@patch('sagemaker.utils.download_folder') +def test_train_with_hyperparameters_without_job_name(download_folder, _cleanup, _stream_output, LocalSession, tmpdir): directories = [str(tmpdir.mkdir('container-root')), str(tmpdir.mkdir('data'))] with patch('sagemaker.local.image._SageMakerContainer._create_tmp_folder', @@ -286,8 +287,8 @@ def test_train_with_hyperparameters_without_job_name(_download_folder, _cleanup, @patch('sagemaker.local.image._stream_output', side_effect=RuntimeError('this is expected')) @patch('subprocess.Popen') @patch('sagemaker.local.image._SageMakerContainer._cleanup') -@patch('sagemaker.local.image._SageMakerContainer._download_folder') -def test_train_error(_download_folder, _cleanup, popen, _stream_output, LocalSession, tmpdir, sagemaker_session): +@patch('sagemaker.utils.download_folder') +def test_train_error(download_folder, _cleanup, popen, _stream_output, LocalSession, tmpdir, sagemaker_session): directories = [str(tmpdir.mkdir('container-root')), str(tmpdir.mkdir('data'))] with patch('sagemaker.local.image._SageMakerContainer._create_tmp_folder', side_effect=directories): @@ -305,8 +306,8 @@ def test_train_error(_download_folder, _cleanup, popen, _stream_output, LocalSes @patch('sagemaker.local.image._stream_output') @patch('subprocess.Popen') @patch('sagemaker.local.image._SageMakerContainer._cleanup') -@patch('sagemaker.local.image._SageMakerContainer._download_folder') -def test_train_local_code(_download_folder, _cleanup, popen, _stream_output, +@patch('sagemaker.utils.download_folder') +def test_train_local_code(download_folder, _cleanup, popen, _stream_output, _local_session, tmpdir, sagemaker_session): directories = [str(tmpdir.mkdir('container-root')), str(tmpdir.mkdir('data'))] with patch('sagemaker.local.image._SageMakerContainer._create_tmp_folder', @@ -391,11 +392,11 @@ def test_serve_local_code(up, copy, copytree, tmpdir, sagemaker_session): assert '%s:/opt/ml/code' % '/tmp/code' in volumes -@patch('sagemaker.local.image._SageMakerContainer._download_file') +@patch('sagemaker.utils.download_file') @patch('tarfile.is_tarfile') @patch('tarfile.open', MagicMock()) @patch('os.makedirs', Mock()) -def test_prepare_serving_volumes_with_s3_model(is_tarfile, _download_file, sagemaker_session): +def test_prepare_serving_volumes_with_s3_model(is_tarfile, download_file, sagemaker_session): sagemaker_container = _SageMakerContainer('local', 1, 'some-image', sagemaker_session=sagemaker_session) sagemaker_container.container_root = '/tmp/container_root' @@ -406,7 +407,7 @@ def test_prepare_serving_volumes_with_s3_model(is_tarfile, _download_file, sagem volumes = sagemaker_container._prepare_serving_volumes('s3://bucket/my_model.tar.gz') tar_location = os.path.join(container_model_dir, 'my_model.tar.gz') - _download_file.assert_called_with('bucket', '/my_model.tar.gz', tar_location) + download_file.assert_called_with('bucket', '/my_model.tar.gz', tar_location, sagemaker_session) is_tarfile.assert_called_with(tar_location) assert len(volumes) == 1 @@ -427,58 +428,6 @@ def test_prepare_serving_volumes_with_local_model(sagemaker_session): assert volumes[0].host_dir == '/path/to/my_model' -@patch('os.makedirs') -def test_download_folder(makedirs): - boto_mock = Mock(name='boto_session') - boto_mock.client('sts').get_caller_identity.return_value = {'Account': '123'} - - session = sagemaker.Session(boto_session=boto_mock, sagemaker_client=Mock()) - - train_data = Mock() - validation_data = Mock() - - train_data.bucket_name.return_value = BUCKET_NAME - train_data.key = '/prefix/train/train_data.csv' - validation_data.bucket_name.return_value = BUCKET_NAME - validation_data.key = '/prefix/train/validation_data.csv' - - s3_files = [train_data, validation_data] - boto_mock.resource('s3').Bucket(BUCKET_NAME).objects.filter.return_value = s3_files - - obj_mock = Mock() - boto_mock.resource('s3').Object.return_value = obj_mock - - sagemaker_container = _SageMakerContainer('local', 2, 'my-image', sagemaker_session=session) - sagemaker_container._download_folder(BUCKET_NAME, '/prefix', '/tmp') - - obj_mock.download_file.assert_called() - calls = [call(os.path.join('/tmp', 'train/train_data.csv')), - call(os.path.join('/tmp', 'train/validation_data.csv'))] - obj_mock.download_file.assert_has_calls(calls) - obj_mock.reset_mock() - - # Testing with a trailing slash for the prefix. - sagemaker_container._download_folder(BUCKET_NAME, '/prefix/', '/tmp') - obj_mock.download_file.assert_called() - calls = [call(os.path.join('/tmp', 'train/train_data.csv')), - call(os.path.join('/tmp', 'train/validation_data.csv'))] - - obj_mock.download_file.assert_has_calls(calls) - - -def test_download_file(): - boto_mock = Mock(name='boto_session') - boto_mock.client('sts').get_caller_identity.return_value = {'Account': '123'} - bucket_mock = Mock() - boto_mock.resource('s3').Bucket.return_value = bucket_mock - session = sagemaker.Session(boto_session=boto_mock, sagemaker_client=Mock()) - - sagemaker_container = _SageMakerContainer('local', 2, 'my-image', sagemaker_session=session) - sagemaker_container._download_file(BUCKET_NAME, '/prefix/path/file.tar.gz', '/tmp/file.tar.gz') - - bucket_mock.download_file.assert_called_with('prefix/path/file.tar.gz', '/tmp/file.tar.gz') - - def test_ecr_login_non_ecr(): session_mock = Mock() sagemaker.local.image._ecr_login_if_needed(session_mock, 'ubuntu') diff --git a/tests/unit/test_local_data.py b/tests/unit/test_local_data.py new file mode 100644 index 0000000000..1f0be09bf2 --- /dev/null +++ b/tests/unit/test_local_data.py @@ -0,0 +1,240 @@ +# Copyright 2017-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You +# may not use this file except in compliance with the License. A copy of +# the License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file 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. +from __future__ import absolute_import + +import sys + +import pytest +from mock import patch, Mock + +import sagemaker.amazon +import sagemaker.local.data + + +@patch('sagemaker.local.data.LocalFileDataSource') +def test_get_data_source_instance_with_file(LocalFileDataSource, sagemaker_local_session): + # file + data_source = sagemaker.local.data.get_data_source_instance('file:///my/file', sagemaker_local_session) + LocalFileDataSource.assert_called_with('/my/file') + assert data_source is not None + + +@patch('sagemaker.local.data.S3DataSource') +def test_get_data_source_instance_with_s3(S3DataSource, sagemaker_local_session): + data_source = sagemaker.local.data.get_data_source_instance('s3://bucket/path', sagemaker_local_session) + S3DataSource.assert_called_with('bucket', '/path', sagemaker_local_session) + assert data_source is not None + + +@patch('os.path.exists', Mock(return_value=True)) +@patch('os.path.abspath', lambda x: x) +@patch('os.path.isdir', lambda x: x[-1] == '/') +@patch('os.path.isfile', lambda x: x[-1] != '/') +@patch('os.listdir') +def test_file_data_source_get_file_list_with_folder(listdir): + data_source = sagemaker.local.data.LocalFileDataSource('/some/path/') + listdir.return_value = [ + '/some/path/a', + '/some/path/b', + '/some/path/c/', + '/some/path/c/a' + ] + expected = [ + '/some/path/a', + '/some/path/b', + '/some/path/c/a' + ] + result = data_source.get_file_list() + assert result == expected + + +@patch('os.path.exists', Mock(return_value=True)) +@patch('os.path.abspath', lambda x: x) +@patch('os.path.isdir', lambda x: x[-1] == '/') +@patch('os.path.isfile', lambda x: x[-1] != '/') +def test_file_data_source_get_file_list_with_single_file(): + data_source = sagemaker.local.data.LocalFileDataSource('/some/batch/file.csv') + assert data_source.get_file_list() == ['/some/batch/file.csv'] + + +@patch('os.path.exists', Mock(return_value=True)) +@patch('os.path.abspath', lambda x: x) +@patch('os.path.isdir', lambda x: x[-1] == '/') +def test_file_data_source_get_root(): + data_source = sagemaker.local.data.LocalFileDataSource('/some/path/') + assert data_source.get_root_dir() == '/some/path/' + + data_source = sagemaker.local.data.LocalFileDataSource('/some/path/my_file.csv') + assert data_source.get_root_dir() == '/some/path' + + +@patch('sagemaker.local.data.LocalFileDataSource') +@patch('sagemaker.utils.download_folder') +@patch('tempfile.mkdtemp', lambda dir: '/tmp/working_dir') +def test_s3_data_source(download_folder, LocalFileDataSource, sagemaker_local_session): + data_source = sagemaker.local.data.S3DataSource('my_bucket', '/transform/data', sagemaker_local_session) + download_folder.assert_called() + data_source.get_file_list() + LocalFileDataSource().get_file_list.assert_called() + data_source.get_root_dir() + LocalFileDataSource().get_root_dir.assert_called() + + +def test_get_splitter_instance_with_valid_types(): + splitter = sagemaker.local.data.get_splitter_instance(None) + assert isinstance(splitter, sagemaker.local.data.NoneSplitter) + + splitter = sagemaker.local.data.get_splitter_instance('Line') + assert isinstance(splitter, sagemaker.local.data.LineSplitter) + + splitter = sagemaker.local.data.get_splitter_instance('RecordIO') + assert isinstance(splitter, sagemaker.local.data.RecordIOSplitter) + + +def test_get_splitter_instance_with_invalid_types(): + with pytest.raises(ValueError): + sagemaker.local.data.get_splitter_instance('SomethingInvalid') + + +def test_none_splitter(tmpdir): + test_file_path = tmpdir.join('none_test.txt') + + with test_file_path.open('w') as f: + f.write('this\nis\na\ntest') + + splitter = sagemaker.local.data.NoneSplitter() + data = [x for x in splitter.split(str(test_file_path))] + assert data == ['this\nis\na\ntest'] + + +def test_line_splitter(tmpdir): + test_file_path = tmpdir.join('line_test.txt') + + with test_file_path.open('w') as f: + for i in range(10): + f.write('%s\n' % i) + + splitter = sagemaker.local.data.LineSplitter() + data = [x for x in splitter.split(str(test_file_path))] + assert len(data) == 10 + for i in range(10): + assert data[i] == '%s\n' % str(i) + + +def test_recordio_splitter(tmpdir): + test_file_path = tmpdir.join('recordio_test.txt') + with test_file_path.open('wb') as f: + for i in range(10): + data = str(i).encode('utf-8') + sagemaker.amazon.common._write_recordio(f, data) + + splitter = sagemaker.local.data.RecordIOSplitter() + data = [x for x in splitter.split(str(test_file_path))] + + assert len(data) == 10 + + +def test_get_batch_strategy_instance_with_valid_type(): + # Single Record + strategy = sagemaker.local.data.get_batch_strategy_instance('SingleRecord', None) + assert isinstance(strategy, sagemaker.local.data.SingleRecordStrategy) + + # Multi Record + strategy = sagemaker.local.data.get_batch_strategy_instance('MultiRecord', None) + assert isinstance(strategy, sagemaker.local.data.MultiRecordStrategy) + + +def test_get_batch_strategy_instance_with_invalid_type(): + with pytest.raises(ValueError): + # something invalid + sagemaker.local.data.get_batch_strategy_instance('NiceRecord', None) + + +def test_single_record_strategy_with_small_records(): + splitter = Mock() + + single_record = sagemaker.local.data.SingleRecordStrategy(splitter) + data = ['123', '456', '789'] + splitter.split.return_value = data + + # given 3 small records the output should be the same 3 records + batch_records = [r for r in single_record.pad('some_file', 6)] + assert data == batch_records + + +def test_single_record_strategy_with_large_records(): + splitter = Mock() + mb = 1024 * 1024 + + single_record = sagemaker.local.data.SingleRecordStrategy(splitter) + # We will construct a huge record greater than 1MB and we expect an exception + # since there is no way to fit this with the payload size. + buffer = '' + while sys.getsizeof(buffer) < 2 * mb: + buffer += '1' * 100 + + data = [buffer] + with pytest.raises(RuntimeError): + splitter.split.return_value = data + batch_records = [r for r in single_record.pad('some_file', 1)] + print(batch_records) + + +def test_single_record_strategy_with_no_payload_limit(): + # passing 0 as the max_payload_size should work and a 1MB record should be returned + # correctly. + splitter = Mock() + mb = 1024 * 1024 + + buffer = '' + while sys.getsizeof(buffer) < 2 * mb: + buffer += '1' * 100 + splitter.split.return_value = [buffer] + + single_record = sagemaker.local.data.SingleRecordStrategy(splitter) + batch_records = [r for r in single_record.pad('some_file', 0)] + assert len(batch_records) == 1 + + +def test_multi_record_strategy_with_small_records(): + splitter = Mock() + + multi_record = sagemaker.local.data.MultiRecordStrategy(splitter) + data = ['123', '456', '789'] + splitter.split.return_value = data + + # given 3 small records, the output should be 1 single record with the data from all 3 combined + batch_records = [r for r in multi_record.pad('some_file', 6)] + assert len(batch_records) == 1 + assert batch_records[0] == '123456789' + + +def test_multi_record_strategy_with_large_records(): + splitter = Mock() + mb = 1024 * 1024 + + multi_record = sagemaker.local.data.MultiRecordStrategy(splitter) + # we will construct several large records and we expect them to be merged into <1MB ones + buffer = '' + while sys.getsizeof(buffer) < 0.5 * mb: + buffer += '1' * 100 + + # buffer should be aprox 0.5 MB. We will make the data total 10 MB made out of 0.5mb records + # with a max_payload size of 1MB the expectation is to have ~10 output records. + + data = [buffer for _ in range(10)] + splitter.split.return_value = data + + batch_records = [r for r in multi_record.pad('some_file', 1)] + # check with 11 because there may be a bit of leftover. + assert len(batch_records) <= 11 diff --git a/tests/unit/test_local_entities.py b/tests/unit/test_local_entities.py new file mode 100644 index 0000000000..86180951dd --- /dev/null +++ b/tests/unit/test_local_entities.py @@ -0,0 +1,165 @@ +# Copyright 2017-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You +# may not use this file except in compliance with the License. A copy of +# the License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file 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. +from __future__ import absolute_import + +import os +import pytest + +from mock import patch, Mock + +import sagemaker.local + + +@pytest.fixture(scope='session') +def local_transform_job(sagemaker_local_session): + with patch('sagemaker.local.local_session.LocalSagemakerClient.describe_model') as describe_model: + describe_model.return_value = {'PrimaryContainer': {'Environment': {}, 'Image': 'some-image:1.0'}} + job = sagemaker.local.entities._LocalTransformJob('my-transform-job', 'some-model', sagemaker_local_session) + return job + + +@patch('sagemaker.local.local_session.LocalSagemakerClient.describe_model', Mock(return_value={'PrimaryContainer': {}})) +def test_local_transform_job_init(sagemaker_local_session): + job = sagemaker.local.entities._LocalTransformJob('my-transform-job', 'some-model', sagemaker_local_session) + assert job.name == 'my-transform-job' + assert job.state == sagemaker.local.entities._LocalTransformJob._CREATING + + +def test_local_transform_job_container_environment(local_transform_job): + transform_kwargs = { + 'MaxPayloadInMB': 3, + 'BatchStrategy': 'MultiRecord', + } + container_env = local_transform_job._get_container_environment(**transform_kwargs) + + assert 'SAGEMAKER_BATCH' in container_env + assert 'SAGEMAKER_MAX_PAYLOAD_IN_MB' in container_env + assert 'SAGEMAKER_BATCH_STRATEGY' in container_env + assert 'SAGEMAKER_MAX_CONCURRENT_TRANSFORMS' in container_env + + transform_kwargs = { + 'BatchStrategy': 'SingleRecord', + } + + container_env = local_transform_job._get_container_environment(**transform_kwargs) + + assert 'SAGEMAKER_BATCH' in container_env + assert 'SAGEMAKER_BATCH_STRATEGY' in container_env + assert 'SAGEMAKER_MAX_CONCURRENT_TRANSFORMS' in container_env + + transform_kwargs = { + 'Environment': {'MY_ENV': 3} + } + + container_env = local_transform_job._get_container_environment(**transform_kwargs) + + assert 'SAGEMAKER_BATCH' in container_env + assert 'SAGEMAKER_MAX_PAYLOAD_IN_MB' not in container_env + assert 'SAGEMAKER_BATCH_STRATEGY' not in container_env + assert 'SAGEMAKER_MAX_CONCURRENT_TRANSFORMS' in container_env + assert 'MY_ENV' in container_env + + +def test_local_transform_job_defaults_with_empty_args(local_transform_job): + transform_kwargs = {} + defaults = local_transform_job._get_required_defaults(**transform_kwargs) + assert 'BatchStrategy' in defaults + assert 'MaxPayloadInMB' in defaults + + +def test_local_transform_job_defaults_with_batch_strategy(local_transform_job): + transform_kwargs = {'BatchStrategy': 'my-own'} + defaults = local_transform_job._get_required_defaults(**transform_kwargs) + assert 'BatchStrategy' not in defaults + assert 'MaxPayloadInMB' in defaults + + +def test_local_transform_job_defaults_with_max_payload(local_transform_job): + transform_kwargs = {'MaxPayloadInMB': 322} + defaults = local_transform_job._get_required_defaults(**transform_kwargs) + assert 'BatchStrategy' in defaults + assert 'MaxPayloadInMB' not in defaults + + +@patch('sagemaker.local.entities._SageMakerContainer', Mock()) +@patch('sagemaker.local.entities._wait_for_serving_container', Mock()) +@patch('sagemaker.local.entities._perform_request') +@patch('sagemaker.local.entities._LocalTransformJob._perform_batch_inference') +def test_start_local_transform_job(_perform_batch_inference, _perform_request, local_transform_job): + input_data = {} + output_data = {} + transform_resources = {'InstanceType': 'local'} + + response = Mock() + _perform_request.return_value = (response, 200) + response.read.return_value = '{"BatchStrategy": "SingleRecord"}' + local_transform_job.primary_container['ModelDataUrl'] = 'file:///some/model' + local_transform_job.start(input_data, output_data, transform_resources, Environment={}) + + _perform_batch_inference.assert_called() + response = local_transform_job.describe() + assert response['TransformJobStatus'] == 'Completed' + + +@patch('sagemaker.local.data.get_batch_strategy_instance') +@patch('sagemaker.local.data.get_data_source_instance') +@patch('sagemaker.local.entities.move_to_destination') +@patch('sagemaker.local.entities.get_config_value') +def test_local_transform_job_perform_batch_inference(get_config_value, move_to_destination, get_data_source_instance, + get_batch_strategy_instance, local_transform_job, tmpdir): + input_data = { + 'DataSource': { + 'S3DataSource': { + 'S3Uri': 's3://some_bucket/nice/data' + } + }, + 'ContentType': 'text/csv' + } + + output_data = { + 'S3OutputPath': 's3://bucket/output', + 'AssembleWith': 'Line' + } + + transform_kwargs = { + 'MaxPayloadInMB': 3, + 'BatchStrategy': 'MultiRecord', + } + + data_source = Mock() + data_source.get_file_list.return_value = ['/tmp/file1', '/tmp/file2'] + data_source.get_root_dir.return_value = '/tmp' + get_data_source_instance.return_value = data_source + + batch_strategy = Mock() + batch_strategy.pad.return_value = 'some data' + get_batch_strategy_instance.return_value = batch_strategy + + get_config_value.return_value = str(tmpdir) + + runtime_client = Mock() + response_object = Mock() + response_object.read.return_value = b'data' + runtime_client.invoke_endpoint.return_value = {'Body': response_object} + local_transform_job.local_session.sagemaker_runtime_client = runtime_client + + local_transform_job.container = Mock() + + local_transform_job._perform_batch_inference(input_data, output_data, **transform_kwargs) + + dir, output, session = move_to_destination.call_args[0] + assert output == 's3://bucket/output' + output_files = os.listdir(dir) + assert len(output_files) == 2 + assert 'file1.out' in output_files + assert 'file2.out' in output_files diff --git a/tests/unit/test_local_session.py b/tests/unit/test_local_session.py index 83e20a4cbf..78d9b49e77 100644 --- a/tests/unit/test_local_session.py +++ b/tests/unit/test_local_session.py @@ -172,6 +172,27 @@ def test_describe_model(LocalSession): assert response['PrimaryContainer']['ModelDataUrl'] == '/some/model/path' +@patch('sagemaker.local.local_session._LocalTransformJob') +@patch('sagemaker.local.local_session.LocalSession') +def test_create_transform_job(LocalSession, _LocalTransformJob): + local_sagemaker_client = sagemaker.local.local_session.LocalSagemakerClient() + + local_sagemaker_client.create_transform_job('transform-job', 'some-model', None, None, None) + _LocalTransformJob().start.assert_called_with(None, None, None) + + local_sagemaker_client.describe_transform_job('transform-job') + _LocalTransformJob().describe.assert_called() + + +@patch('sagemaker.local.local_session._LocalTransformJob') +@patch('sagemaker.local.local_session.LocalSession') +def test_describe_transform_job_does_not_exist(LocalSession, _LocalTransformJob): + local_sagemaker_client = sagemaker.local.local_session.LocalSagemakerClient() + + with pytest.raises(ClientError): + local_sagemaker_client.describe_transform_job('transform-job-does-not-exist') + + @patch('sagemaker.local.local_session.LocalSession') def test_describe_endpoint_config(LocalSession): local_sagemaker_client = sagemaker.local.local_session.LocalSagemakerClient() diff --git a/tests/unit/test_local_utils.py b/tests/unit/test_local_utils.py new file mode 100644 index 0000000000..a4f2bb35fb --- /dev/null +++ b/tests/unit/test_local_utils.py @@ -0,0 +1,37 @@ +# Copyright 2017-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You +# may not use this file except in compliance with the License. A copy of +# the License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file 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. +from __future__ import absolute_import + +import pytest +from mock import patch, Mock + +import sagemaker + +BUCKET_NAME = 'some-nice-bucket' + + +@patch('shutil.rmtree', Mock()) +@patch('sagemaker.local.utils.recursive_copy') +def test_move_to_destination(recursive_copy): + # local files will just be recursive copied + sagemaker.local.utils.move_to_destination('/tmp/data', 'file:///target/dir/', None) + recursive_copy.assert_called() + + # s3 destination will upload to S3 + sms = Mock() + sagemaker.local.utils.move_to_destination('/tmp/data', 's3://bucket/path', sms) + sms.upload_data.assert_called() + + # weird destination, should raise an exception + with pytest.raises(ValueError): + sagemaker.local.utils.move_to_destination('/tmp/data', 'ftp://ftp/in/2018', None) diff --git a/tests/unit/test_transformer.py b/tests/unit/test_transformer.py index 200d5df52d..1342cf5817 100644 --- a/tests/unit/test_transformer.py +++ b/tests/unit/test_transformer.py @@ -43,7 +43,7 @@ @pytest.fixture() def sagemaker_session(): boto_mock = Mock(name='boto_session') - return Mock(name='sagemaker_session', boto_session=boto_mock) + return Mock(name='sagemaker_session', boto_session=boto_mock, local_mode=False) @pytest.fixture() diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index d8b0bc67ec..0caa7ae6df 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -14,17 +14,21 @@ # language governing permissions and limitations under the License. from __future__ import absolute_import +from datetime import datetime +import os +import time + import pytest -from mock import patch +from mock import call, patch, Mock +import sagemaker from sagemaker.utils import get_config_value, name_from_base,\ to_str, DeferredError, extract_name_from_job_arn, secondary_training_status_changed,\ secondary_training_status_message -from datetime import datetime -import time NAME = 'base_name' +BUCKET_NAME = 'some_bucket' def test_get_config_value(): @@ -166,3 +170,80 @@ def test_secondary_training_status_message_prev_missing(): MESSAGE ) assert secondary_training_status_message(TRAINING_JOB_DESCRIPTION_1, {}) == expected + + +@patch('os.makedirs') +def test_download_folder(makedirs): + boto_mock = Mock(name='boto_session') + boto_mock.client('sts').get_caller_identity.return_value = {'Account': '123'} + + session = sagemaker.Session(boto_session=boto_mock, sagemaker_client=Mock()) + + train_data = Mock() + validation_data = Mock() + + train_data.bucket_name.return_value = BUCKET_NAME + train_data.key = 'prefix/train/train_data.csv' + validation_data.bucket_name.return_value = BUCKET_NAME + validation_data.key = 'prefix/train/validation_data.csv' + + s3_files = [train_data, validation_data] + boto_mock.resource('s3').Bucket(BUCKET_NAME).objects.filter.return_value = s3_files + + obj_mock = Mock() + boto_mock.resource('s3').Object.return_value = obj_mock + + # all the S3 mocks are set, the test itself begins now. + sagemaker.utils.download_folder(BUCKET_NAME, '/prefix', '/tmp', session) + + obj_mock.download_file.assert_called() + calls = [call(os.path.join('/tmp', 'train/train_data.csv')), + call(os.path.join('/tmp', 'train/validation_data.csv'))] + obj_mock.download_file.assert_has_calls(calls) + obj_mock.reset_mock() + + # Testing with a trailing slash for the prefix. + sagemaker.utils.download_folder(BUCKET_NAME, '/prefix/', '/tmp', session) + obj_mock.download_file.assert_called() + obj_mock.download_file.assert_has_calls(calls) + + +@patch('os.makedirs') +def test_download_folder_points_to_single_file(makedirs): + boto_mock = Mock(name='boto_session') + boto_mock.client('sts').get_caller_identity.return_value = {'Account': '123'} + + session = sagemaker.Session(boto_session=boto_mock, sagemaker_client=Mock()) + + train_data = Mock() + + train_data.bucket_name.return_value = BUCKET_NAME + train_data.key = 'prefix/train/train_data.csv' + + s3_files = [train_data] + boto_mock.resource('s3').Bucket(BUCKET_NAME).objects.filter.return_value = s3_files + + obj_mock = Mock() + boto_mock.resource('s3').Object.return_value = obj_mock + + # all the S3 mocks are set, the test itself begins now. + sagemaker.utils.download_folder(BUCKET_NAME, '/prefix/train/train_data.csv', '/tmp', session) + + obj_mock.download_file.assert_called() + calls = [call(os.path.join('/tmp', 'train_data.csv'))] + obj_mock.download_file.assert_has_calls(calls) + assert boto_mock.resource('s3').Bucket(BUCKET_NAME).objects.filter.call_count == 1 + obj_mock.reset_mock() + + +def test_download_file(): + boto_mock = Mock(name='boto_session') + boto_mock.client('sts').get_caller_identity.return_value = {'Account': '123'} + bucket_mock = Mock() + boto_mock.resource('s3').Bucket.return_value = bucket_mock + session = sagemaker.Session(boto_session=boto_mock, sagemaker_client=Mock()) + + sagemaker.utils.download_file(BUCKET_NAME, '/prefix/path/file.tar.gz', + '/tmp/file.tar.gz', session) + + bucket_mock.download_file.assert_called_with('prefix/path/file.tar.gz', '/tmp/file.tar.gz')