profile
viewpoint
Yong Tang yongtang San Francisco Bay Area, CA https://www.linkedin.com/in/yong-tang/ Open source contributor, CoreDNS, Docker, SwarmKit, TensorFlow committer.

pull request commenttensorflow/io

Patching 0.8.0 release

@vlasenkoalexey can you also bump the version in: https://github.com/tensorflow/io/blob/ad33b20cb703b1d8a2eebdb30c41101208bb2940/tensorflow_io/core/python/ops/io_info.py

I think both 0.8.1 and 0.9.1 branch may need to be updated.

vlasenkoalexey

comment created time in 4 hours

pull request commenttensorflow/io

Patching 0.8.0 release

Thanks @vlasenkoalexey. R may need big changes for 2.0 (the binding was build around 1.x before) so it is stalled. We will pick up and update the R once the APIs in tensorflow-io are relatively stable. /cc @terrytangyuan.

vlasenkoalexey

comment created time in 4 hours

issue commenttensorflow/io

Provide Keras native I/O though IO-Layer for Kafka

The PR is opened in #634

yongtang

comment created time in 7 hours

issue commenttensorflow/io

Provide Keras native I/O though IO-Layer for Kafka

Created a PR #634 for this issue. Here is a rough usage:


  model = tf.keras.Sequential([
      tf.keras.layers.Flatten(input_shape=(28, 28)),
      tf.keras.layers.Dense(128, activation=tf.nn.relu),
      tf.keras.layers.Dense(10, activation=tf.nn.softmax)
  ])

  model.compile(optimizer='adam',
                loss='sparse_categorical_crossentropy',
                metrics=['accuracy'])

  model.fit(train_images, train_labels, epochs=5)

  model.summary()

  # For predict, let's create an additional layer to tee to kafka
  io_layer = tfio.IOLayer.kafka("topic")

  # model.layers[-1].output is the output of the old model,
  # we add an additional layer of IOLayer on top of it, to `tee` the output data.
  io_model = tf.keras.models.Model(
      inputs=model.input,
      outputs=io_layer(model.layers[-1].output))

  # use new model for inference, however, since IOLayer does nothing
  # other than tee the data, no impact on model itself:
  predictions = io_model.predict(test_images)

  io_layer.sync()

/cc @terrytangyuan @BryanCutler

Also /cc @zhjunqin @kaiwaehner @sbaier1 as it is related to Kafka and some discussions.

yongtang

comment created time in 7 hours

PR opened tensorflow/io

Add tf.keras native io processing

This PR adds IOLayer as an attempt to have a tf.keras-native io processing.

The idea about IOLayer is that IOLayer is a special layer that pass through input/output of the keras model, and send a copy (tee) to a storage such as text file or kafka streaming.

As such the following is possible:

  model = tf.keras.Sequential([
      tf.keras.layers.Flatten(input_shape=(28, 28)),
      tf.keras.layers.Dense(128, activation=tf.nn.relu),
      tf.keras.layers.Dense(10, activation=tf.nn.softmax)
  ])

  model.compile(optimizer='adam',
                loss='sparse_categorical_crossentropy',
                metrics=['accuracy'])

  model.fit(train_images, train_labels, epochs=5)

  model.summary()

  # For predict, let's create an additional layer to tee to kafka
  io_layer = tfio.IOLayer.kafka("topic")

  io_model = tf.keras.models.Model(
      inputs=model.input,
      outputs=io_layer(model.layers[-1].output))

  predictions = io_model.predict(test_images)

  io_layer.sync()

You could even pass IOLayer to the middle of the keras model for training:

  f, filename = tempfile.mkstemp()
  os.close(f)
  io_layer = tfio.IOLayer.text(filename)

  model = tf.keras.Sequential([
      tf.keras.layers.Flatten(input_shape=(28, 28)),
      io_layer,
      tf.keras.layers.Dense(128, activation=tf.nn.relu),
      tf.keras.layers.Dense(10, activation=tf.nn.softmax)
  ])

  model.compile(optimizer='adam',
                loss='sparse_categorical_crossentropy',
                metrics=['accuracy'])

  model.fit(train_images, train_labels, epochs=5)

  model.summary()`

Though the above may not be that useful in most of the situations as it will be substentially slower during traing to also write data back to storage.

There are several advantages of using layer for IO:

  1. It guarantees that everything runs in graph mode. In the past we tried to use keras' callback function to achieve the IO but that runs in eager mode in callback
  2. It provides a simple API that ties to users that are already familiar with keras.

This PR fixes #633

Signed-off-by: Yong Tang yong.tang.github@outlook.com

+676 -1

0 comment

11 changed files

pr created time in 7 hours

issue openedtensorflow/io

Provide Keras native I/O though IO-Layer for Kafka

This comes from one discussion about Kafka + TensorFlow IO for predict.

How can we turn the script into something that continuously streams/predicts from/to kafka?

During model.predict we used to rely on KerasCallback to capture the output of the data in a continuous fashion. There are several issues:

  1. KerasCallback is in eager mode so it means switching back and forth in graph/eager mode.
  2. It is not easy to combine the input data with output data when we need to do some further processing (e.g., calculate the statistics while in inference.).

Thinking again, I think in the past we over-complicates the situation. Keras essentially is a TF graph and every layer is a collection of subgraph. Keras's logic at the input data processing is getting completed because it need to support generator, tensor, tf.data, numpy arrays, etc. (so many ways to pass the data).

However, in its core Keras is still a TF graph. So for any IO operation all we need is to just add a node in the TF graph, or, similar to tf.keras.layers, add a collection of nodes in the TF graph.

As such I think it is possible to construct an IO operation as a layer of the tf.keras.

Below is a rough diagram:

Kafka+Keras

created time in 7 hours

delete branch yongtang/tensorflow

delete branch : any-dataset-autograph

delete time in 7 hours

create barnchyongtang/io

branch : io-layer

created branch time in 7 hours

pull request commenttensorflow/io

Patching 0.8.0 release

@vlasenkoalexey overall looks good to me.

Since tensorflow-io 0.8.0/0.9.0, our way of release is to let Travis CI automatically build all platforms and push "release candidates" to a dropbox location:

https://www.dropbox.com/sh/dg0npidir5v1xki/AACor-91kbJh1ScqAdYpxdEca?dl=0

The detail of the release processing is in https://github.com/tensorflow/community/blob/master/sigs/io/RELEASE.md

The script to push to dropbox location is in: https://github.com/tensorflow/io/blob/98f52b669496602757ee801afa6b91fab041482b/.travis.yml#L67 then =>

https://github.com/tensorflow/io/blob/98f52b669496602757ee801afa6b91fab041482b/.travis/after-success.sh

However, 0.8.0 and 0.9.0 was built from master branch so in after-success.sh: https://github.com/tensorflow/io/blob/98f52b669496602757ee801afa6b91fab041482b/.travis/after-success.sh#L17

as you could see only master branch has been covered.

Can you also change the above line to cover the branch R0.81 and R0.91? Then I think the build will work correctly and all binaries could be pulled from the dropbox location.

vlasenkoalexey

comment created time in 8 hours

push eventyongtang/io

Aleksey Vlasenko

commit sha e451bf5f304be8e84a08b17ae1019c5a16fb6a1f

making sure that bigquery reader is returning meaningfull defaults for null values (#626) * making sure that bigquery reader is returning meaningfull defaults for null values * linter fixes

view details

Yong Tang

commit sha 48223869b0f5c39493e648bd506b15ab1a0e1904

DICOM doc update (#625) * DICOM doc update This PR is a follow up for 624, which was merged prematurely (sorry). This PR: 1) Popoulate the python docstring of `tfio.image.decode_dicom_image` and `tfio.image.decode_dicom_data` and carry the content from original README.md. 2) Added linking to the tutorial from the python docstring, as was suggested in the review. 3) The tensorflow_io/dicom had been move to tfio.image.decode_dicom_image and tfio.image.decode_dicom_data. As such the REAME.md in tensorflow_io/dicom is not visible anymore. This PR uses python docstring to provides all the necessarily information, including additional links and citations. Also a couple of small typos and missing `,` have been fixed. This PR is a following up of 624. Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Move %tensorflow_version, use tfio-nightly * This avoids tfio reinstalling tf before applying tf_version. * `tfio.image` doesn't exist in the current stable tfio.

view details

push time in 15 hours

delete branch yongtang/io

delete branch : dicom-doc-2

delete time in 15 hours

push eventtensorflow/io

Yong Tang

commit sha 48223869b0f5c39493e648bd506b15ab1a0e1904

DICOM doc update (#625) * DICOM doc update This PR is a follow up for 624, which was merged prematurely (sorry). This PR: 1) Popoulate the python docstring of `tfio.image.decode_dicom_image` and `tfio.image.decode_dicom_data` and carry the content from original README.md. 2) Added linking to the tutorial from the python docstring, as was suggested in the review. 3) The tensorflow_io/dicom had been move to tfio.image.decode_dicom_image and tfio.image.decode_dicom_data. As such the REAME.md in tensorflow_io/dicom is not visible anymore. This PR uses python docstring to provides all the necessarily information, including additional links and citations. Also a couple of small typos and missing `,` have been fixed. This PR is a following up of 624. Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Move %tensorflow_version, use tfio-nightly * This avoids tfio reinstalling tf before applying tf_version. * `tfio.image` doesn't exist in the current stable tfio.

view details

push time in 15 hours

PR merged tensorflow/io

DICOM doc update

This PR is a follow up for #624, which was merged prematurely (sorry).

This PR:

  1. Popoulate the python docstring of tfio.image.decode_dicom_image and tfio.image.decode_dicom_data and carry the content from original README.md.
  2. Added linking to the tutorial from the python docstring, as was suggested in the review.
  3. The tensorflow_io/dicom had been move to tfio.image.decode_dicom_image and tfio.image.decode_dicom_data. As such the REAME.md in tensorflow_io/dicom is not visible anymore. This PR uses python docstring to provides all the necessarily information, including additional links and citations.

Also a couple of small typos and missing , have been fixed.

This PR is a following up of #624.

Signed-off-by: Yong Tang yong.tang.github@outlook.com

+117 -10

5 comments

2 changed files

yongtang

pr closed time in 15 hours

pull request commenttensorflow/io

DICOM doc update

Thanks @MarkDaoust for the help 👍 , much appreciated!

yongtang

comment created time in 15 hours

create barnchyongtang/io

branch : resample_audio

created branch time in 15 hours

push eventcoredns/coredns

dependabot-preview[bot]

commit sha 032a4d9e52147f81682d3f671294654835bf17ae

build(deps): bump google.golang.org/grpc from 1.24.0 to 1.25.1 (#3439) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.24.0 to 1.25.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.24.0...v1.25.1) Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

view details

push time in 15 hours

PR merged coredns/coredns

Reviewers
build(deps): bump google.golang.org/grpc from 1.24.0 to 1.25.1 dep

Bumps google.golang.org/grpc from 1.24.0 to 1.25.1. <details> <summary>Release notes</summary>

Sourced from google.golang.org/grpc's releases.

Release 1.25.1

  • resolver: re-add dns and passthrough packages as references to internal versions

Release 1.25.0

API Changes

  • resolver: move dns and passthrough to internal (#3116)

New Features

  • credentials: add RequestInfo to context passed to GetRequestMetadata (#3057)
  • resolver: add State fields to support error handling (#2951)
  • clientconn: override authority with address's ServerName, if set (#3073)
  • server: add ServerOption HeaderTableSize (#2931)
  • resolver: Add new fields to resolver.BuildOption struct to support dialing a remote name resolver (#3098)
  • client: add WithConnectParams to configure connection backoff and timeout (#2960)

Performance Improvements

  • Use exact size, if known, to allocate decompression buffer (#3048)

Bug Fixes

  • interop, examples: use localhost instead of 127.0.0.1 (#3124)
  • client: fix race between client-side stream cancellation and compressed server data arriving (#3054)
  • grpclb: enter fallback if no balancer addresses are available (#3119)
  • client: fix keepalive ping rate (#3102)
  • clientconn: fix potential deadlock caused by ResetConnectBackoff (#3051)

Documentation

  • doc: add more details to ClientConn (#3096)
  • examples: add Unimplemented___Server to all example servers (#3071)
  • examples: create an example for enabling and configuring retry (#3028)
    • Special Thanks: @​yhyddr </details> <details> <summary>Commits</summary>
  • 1a3960e Change version to 1.25.1
  • 56d5e0d resolver: re-add dns and passthrough packages as references to internal versi...
  • dd4463a Change version to 1.25.1-dev (#3147)
  • 9d331e2 Change version to 1.25.0 (#3146)
  • 6dac020 test: add test of malformed gzip payload (#3141)
  • 6c48774 travis: move example tests to a separate run (#3143)
  • b09352f xds: add new fields to XDSConfig (#3100)
  • bbd4b7a eds: skip unhealthy endpoints (#3137)
  • 583401a Add a general purpose unbounded buffer implementation (#3099)
  • 88bf070 resolver: Add new fields to resolver.BuildOption struct to support dialing a ...
  • Additional commits viewable in compare view </details> <br />

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


<details> <summary>Dependabot commands and options</summary> <br />

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
  • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
  • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
  • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
  • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
  • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

Additionally, you can set the following in your Dependabot dashboard:

  • Update frequency (including time of day and day of week)
  • Pull request limits (per update run and/or open at any time)
  • Out-of-range updates (receive only lockfile updates, if desired)
  • Security updates (receive only security updates, if desired)

</details>

+9 -1

2 comments

2 changed files

dependabot-preview[bot]

pr closed time in 15 hours

push eventcoredns/coredns

dependabot-preview[bot]

commit sha 591942a99ca061bc4694770f00576bc1d45b2070

build(deps): bump github.com/aws/aws-sdk-go from 1.25.25 to 1.25.31 (#3438) Bumps [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) from 1.25.25 to 1.25.31. - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Changelog](https://github.com/aws/aws-sdk-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.25.25...v1.25.31) Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

view details

push time in 15 hours

PR merged coredns/coredns

build(deps): bump github.com/aws/aws-sdk-go from 1.25.25 to 1.25.31 dep

Bumps github.com/aws/aws-sdk-go from 1.25.25 to 1.25.31. <details> <summary>Release notes</summary>

Sourced from github.com/aws/aws-sdk-go's releases.

Release v1.25.31 (2019-11-08)

Service Client Updates

  • service/cognito-identity: Updates service API and documentation
  • service/ecr: Updates service documentation
    • This release contains ticket fixes for Amazon ECR.

SDK Bugs

  • aws/request: Ensure New request handles nil retryer (#2934)
    • Adds additional default behavior to the SDK's New request constructor, to handle the case where a nil Retryer was passed in. This error could occur when the SDK's Request type was being used to create requests directly, not through one of the SDK's client.
    • Fixes #2889

Release v1.25.30 (2019-11-07)

Service Client Updates

  • service/comprehend: Updates service API and documentation
  • service/ssm: Updates service API
    • AWS Systems Manager Session Manager target length increased to 400.
  • service/sso: Adds new service
    • This is an initial release of AWS Single Sign-On (SSO) end-user access. This release adds support for accessing AWS accounts assigned in AWS SSO using short term credentials.
  • service/sso-oidc: Adds new service

Release v1.25.29 (2019-11-06)

Service Client Updates

  • service/savingsplans: Updates service documentation

Release v1.25.28 (2019-11-06)

Service Client Updates

  • service/budgets: Updates service API and documentation
    • Documentation updates for budgets to track Savings Plans utilization and coverage
  • service/ce: Updates service API, documentation, and paginators
  • service/codebuild: Updates service API and documentation
    • Add support for Build Number, Secrets Manager and Exported Environment Variables.
  • service/elasticfilesystem: Updates service API
    • EFS customers can select a lifecycle policy that automatically moves files that have not been accessed for 7 days into the EFS Infrequent Access (EFS IA) storage class. EFS IA provides price/performance that is cost-optimized for files that are not accessed every day.
  • service/savingsplans: Adds new service
  • service/signer: Updates service API and documentation
    • This release adds support for tagging code-signing profiles in AWS Signer.

Release v1.25.27 (2019-11-05)

Service Client Updates

  • service/codestar-notifications: Adds new service </tr></table> ... (truncated) </details> <details> <summary>Changelog</summary>

Sourced from github.com/aws/aws-sdk-go's changelog.

Release v1.25.31 (2019-11-08)

Service Client Updates

  • service/cognito-identity: Updates service API and documentation
  • service/ecr: Updates service documentation
    • This release contains ticket fixes for Amazon ECR.

SDK Bugs

  • aws/request: Ensure New request handles nil retryer (#2934)
    • Adds additional default behavior to the SDK's New request constructor, to handle the case where a nil Retryer was passed in. This error could occur when the SDK's Request type was being used to create requests directly, not through one of the SDK's client.
    • Fixes #2889

Release v1.25.30 (2019-11-07)

Service Client Updates

  • service/comprehend: Updates service API and documentation
  • service/ssm: Updates service API
    • AWS Systems Manager Session Manager target length increased to 400.
  • service/sso: Adds new service
    • This is an initial release of AWS Single Sign-On (SSO) end-user access. This release adds support for accessing AWS accounts assigned in AWS SSO using short term credentials.
  • service/sso-oidc: Adds new service

Release v1.25.29 (2019-11-06)

Service Client Updates

  • service/savingsplans: Updates service documentation

Release v1.25.28 (2019-11-06)

Service Client Updates

  • service/budgets: Updates service API and documentation
    • Documentation updates for budgets to track Savings Plans utilization and coverage
  • service/ce: Updates service API, documentation, and paginators
  • service/codebuild: Updates service API and documentation
    • Add support for Build Number, Secrets Manager and Exported Environment Variables.
  • service/elasticfilesystem: Updates service API
    • EFS customers can select a lifecycle policy that automatically moves files that have not been accessed for 7 days into the EFS Infrequent Access (EFS IA) storage class. EFS IA provides price/performance that is cost-optimized for files that are not accessed every day.
  • service/savingsplans: Adds new service
  • service/signer: Updates service API and documentation
    • This release adds support for tagging code-signing profiles in AWS Signer.

Release v1.25.27 (2019-11-05)

Service Client Updates

  • service/codestar-notifications: Adds new service </tr></table> ... (truncated) </details> <details> <summary>Commits</summary>

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


<details> <summary>Dependabot commands and options</summary> <br />

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
  • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
  • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
  • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
  • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
  • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

Additionally, you can set the following in your Dependabot dashboard:

  • Update frequency (including time of day and day of week)
  • Pull request limits (per update run and/or open at any time)
  • Out-of-range updates (receive only lockfile updates, if desired)
  • Security updates (receive only security updates, if desired)

</details>

+3 -1

0 comment

2 changed files

dependabot-preview[bot]

pr closed time in 15 hours

push eventyongtang/tensorflow

yuan

commit sha 4e90ebf51974c30a28f871598c4dc9e34f72e970

test streaming accuracy python implementation

view details

frreiss

commit sha 37a5a962f8237dc856db0e3558c1c426ded3fc35

Refactor RandomDataset into .h and .cc files Refactor RandomDataset into .h and .cc files Cleanup after refactoring

view details

frreiss

commit sha 4f0b571a9c49ceb2ea08ffc81d43652455033134

Add initial version of test case

view details

frreiss

commit sha e58e43cb4caa3e9f886d9b114f565aedc1b8fa29

Merge branch 'master' of https://github.com/tensorflow/tensorflow into issue-data-random-test

view details

frreiss

commit sha 3ceed238a91a5857837e846bc89c56b4479fc7a7

Merge branch 'master' of https://github.com/tensorflow/tensorflow into issue-data-random-test

view details

frreiss

commit sha 461d313d25504d02bb9880acb9de1a08f41aa73c

Refactor to new format

view details

frreiss

commit sha a1a019fa72556439d3b593a5f32a40ac3924e6d1

Fix typo in human-readable node name

view details

frreiss

commit sha 03927c78e3a19b96b80525c0c9f0ec10a4f3d16d

Merge branch 'master' of https://github.com/tensorflow/tensorflow into issue-data-random-test

view details

frreiss

commit sha 0a70de6321062ec0c991ebec90b5445ee5cd7ef6

Refactor test cases to new format

view details

William D. Irons

commit sha ca79743b8637960ef6c877e81bfdca61bc26e38e

Changes to support ci_build/install scripts with Ubuntu 18.04 docker containers Switched from clang-format-3.8 to clang-format-3.9, as it is available on Ubuntu 18.04, in addition to being available on Ubuntu 14.04 and Ubuntu 16.04. python-setuptools in Ubuntu 18.04 no longer includes easy_install. For Ubuntu 18.04 only, installing pip using the https://bootstrap.pypa.io/get-pip.py python program. Ubuntu 16.04 and 14.04 behavior unchanged. Force installing lazy-object-proxy version 1.4.1, because non x86_64 systems that need to compile from source encounter an error with version 1.4.2: AttributeError: module 'setuptools.build_meta' has no attribute '__legacy__' This error is because we install setuptools with apt, and then replace setuptools with a newer version using pip. This error is resolved in the latest version of setuptools.

view details

Yuan Mingshuai

commit sha f15ca60067df336100270e2e8015a27402d46018

Merge pull request #1 from tensorflow/master update

view details

yuan

commit sha daa8ee0e567eb8acafef51fdd5c80c7971afb307

follow google code style

view details

yuan

commit sha f0b7c7660fdb725b0af9889081c07ba385417143

update bazel BUILD

view details

yuan

commit sha f59eb10a2de91a7e5c334c52e2f9430c08c6af6c

fix usage guide

view details

William D. Irons

commit sha e6a37001953289e4ed22443ed7cc32e1e926e598

Install future with quotes to handle the > symbol pip install future>=0.17.1 will run the command `pip install future` and redirect the output to a file called `=0.17.1`. By putting the command in quotes the redirection is avoided and proper command is run.

view details

yuan

commit sha d4e50e0eda12d9857276e041bc120713e834bd66

fix code style

view details

frreiss

commit sha c6e03aac21b335875fd83ae098a6e61b4c865506

Add direct dependencies to test target

view details

frreiss

commit sha c0e672ff18892d8254283c94b66edb32b3c34f20

Merge branch 'master' of https://github.com/tensorflow/tensorflow into issue-data-random-test

view details

frreiss

commit sha 1d547b2bd4ac0f142ff5869f6593b7d8a1ccb39c

Update build rules to use new random:philox target

view details

Yuan Mingshuai

commit sha 6a0427dc6d884956c56322291f79f17c9811e3e3

Merge pull request #2 from tensorflow/master follow tf branch

view details

push time in a day

issue commenttensorflow/io

KafkaDataset enhancement

PR #628 has been opened to compile avro schema once, and reuse multiple times (avoid recompile for each message).

yongtang

comment created time in a day

pull request commenttensorflow/io

Add option to initialize decode_avro resource, so that compiled avro schema could be reused

/cc @kaiwaehner @sbaier1, this PR is also related to the optimization for KafkaDataset (issue #611).

yongtang

comment created time in a day

PR opened tensorflow/io

Add option to initialize decode_avro resource, so that compiled avro schema could be reused

This PR add a decode_avro_init which returns a resource handle with compiled avro schema.

The resource handle could then be passed to decode_avro multiple times, thus avoiding recompile of avro schema.

Note decode_avro could accept both a string (schema) or a resource handle. If a string is passed, the recompile of schema will be done in place within the kernel ops of decode_avro. This PR is backward-compatible.

This PR is part of the effort for issue #611.

Signed-off-by: Yong Tang yong.tang.github@outlook.com

+113 -12

0 comment

5 changed files

pr created time in a day

create barnchyongtang/io

branch : decode_avro_init

created branch time in a day

pull request commenttensorflow/io

DICOM doc update

Thanks @MarkDaoust. We changed the layout to create different namespaces to maintain some level of compatibility:

  1. tfio.v0: this is the current release of the API version that is relatively stable. It is still v0, not v1, so still subject to deprecation or change, though.
  2. tfio.experimental: this is the experimental release of the API version that could change anytime. This is inline with tensorflow's experimental policy.
  3. In addition, tfio alias tfio.v0 so tfio.image.decode_dicom_data == tfio.v0.image.decode_dicom_data

Also, we tries to group several module/directories into one if possible, as we had too many subdirectories. For example, dicom, tiff, OpenEXR, WebP used to have separate directories for each. Clearly this is not maintainable as the list is getting longer and longer.

Therefore, we place dicom, tiff, OpenExr, and WebP under tfio.image so that the usage becomes tfio.image.decode_webp and tfio.image.decode_dicom_data (vs. tfio.webp.decode_webp and tfio.dicom.decode_dicom_data) respectively.

To take decode_dicom_data as an example:

  1. In the past the API was exposed as tfio.dicom.decode_dicom_data.
  2. Now the API is exposed as tfio.image.decode_dicom_data and tfio.v0.image.decode_dicom_data.

We also use the following way to expose APIs:

  1. tensorflow_io/__init__.py: This is the entry point for tfio. It also points to tensorflow_io/core/python/api/v0/__init__.py tensorflow_io/core/python/api/experimental/__init__.py.

  2. tensorflow_io/core/python/api/v0/__init__.py This is the entry point for tfio and tfio.v0, it points to related modules

  3. tensorflow_io/core/python/api/experimental/__init__.py This is the entry point for tfio.experimental, it points to related modules as well.

Let me know if there are any questions.

yongtang

comment created time in a day

pull request commenttensorflow/io

DICOM doc update

@MarkDaoust Sorry for merging too soon in PR #624. This PR tries to address the remaining comments. Please take a look.

Also, please let me know if any additional changes are needed.

yongtang

comment created time in a day

PR opened tensorflow/io

DICOM doc update

This PR is a follow up for #624, which was merged prematurely (sorry).

This PR:

  1. Popoulate the python docstring of tfio.image.decode_dicom_image and tfio.image.decode_dicom_data and carry the content from original README.md.
  2. Added linking to the tutorial from the python docstring, as was suggested in the review.
  3. The tensorflow_io/dicom had been move to tfio.image.decode_dicom_image and tfio.image.decode_dicom_data. As such the REAME.md in tensorflow_io/dicom is not visible anymore. This PR uses python docstring to provides all the necessarily information, including additional links and citations.

Also a couple of small typos and missing , have been fixed.

This PR is a following up of #624.

Signed-off-by: Yong Tang yong.tang.github@outlook.com

+117 -9

0 comment

2 changed files

pr created time in a day

push eventyongtang/io

Yong Tang

commit sha e73ece8983f0add65e115f9508f128165a2e2693

DICOM doc update This PR is a follow up for 624, which was merged prematurely (sorry). This PR: 1) Popoulate the python docstring of `tfio.image.decode_dicom_image` and `tfio.image.decode_dicom_data` and carry the content from original README.md. 2) Added linking to the tutorial from the python docstring, as was suggested in the review. 3) The tensorflow_io/dicom had been move to tfio.image.decode_dicom_image and tfio.image.decode_dicom_data. As such the REAME.md in tensorflow_io/dicom is not visible anymore. This PR uses python docstring to provides all the necessarily information, including additional links and citations. Also a couple of small typos and missing `,` have been fixed. This PR is a following up of 624. Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in a day

create barnchyongtang/io

branch : dicom-doc-2

created branch time in a day

push eventyongtang/io

Yong Tang

commit sha 127268be2b483b8d331990d6f3306bbc95a5182f

Move Dicom's documentation to docs/tutorials (tensorflow.org/io) (#624) * Move Dicom's documentation to docs/tutorials (tensorflow.org/io) Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Remove display image (will shown automatically) Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Update dicom file Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Update to use NIH Chest X-ray dataset, added the attribution link per dataset usage requirement Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Update toc to use `Decode DICOM files for medical imaging` Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in a day

pull request commenttensorflow/io

Move Dicom's documentation to docs/tutorials (tensorflow.org/io)

@MarkDaoust Sorry, I didn't notice your other comment about providing a link back to the tutorial doc, when I hit the merge. Let me create a new PR to cover it so that you can review.

yongtang

comment created time in a day

delete branch yongtang/io

delete branch : dicom2

delete time in a day

delete branch yongtang/io

delete branch : dicom-doc

delete time in a day

push eventtensorflow/io

Yong Tang

commit sha 127268be2b483b8d331990d6f3306bbc95a5182f

Move Dicom's documentation to docs/tutorials (tensorflow.org/io) (#624) * Move Dicom's documentation to docs/tutorials (tensorflow.org/io) Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Remove display image (will shown automatically) Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Update dicom file Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Update to use NIH Chest X-ray dataset, added the attribution link per dataset usage requirement Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Update toc to use `Decode DICOM files for medical imaging` Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in a day

PR merged tensorflow/io

Move Dicom's documentation to docs/tutorials (tensorflow.org/io)

This PR creates a dicom.ipynb and moves the contents in dicom/README.md to dicom.ipynb

Signed-off-by: Yong Tang yong.tang.github@outlook.com

+311 -85

4 comments

4 changed files

yongtang

pr closed time in a day

pull request commenttensorflow/io

Move Dicom's documentation to docs/tutorials (tensorflow.org/io)

Thanks @MarkDaoust @lamberta for the review. The PR has been updated. Please take a look.

yongtang

comment created time in a day

Pull request review commenttensorflow/io

Move Dicom's documentation to docs/tutorials (tensorflow.org/io)

+{+  "nbformat": 4,+  "nbformat_minor": 0,+  "metadata": {+    "colab": {+      "name": "dicom.ipynb",+      "provenance": [],+      "collapsed_sections": [+        "Tce3stUlHN0L"+      ],+      "toc_visible": true+    },+    "kernelspec": {+      "name": "python3",+      "display_name": "Python 3"+    },+    "language_info": {+      "codemirror_mode": {+        "name": "ipython",+        "version": 3+      },+      "file_extension": ".py",+      "mimetype": "text/x-python",+      "name": "python",+      "nbconvert_exporter": "python",+      "pygments_lexer": "ipython3",+      "version": "3.6.3"+    }+  },+  "cells": [+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "Tce3stUlHN0L"+      },+      "source": [+        "##### Copyright 2019 The TensorFlow IO Authors."+      ]+    },+    {+      "cell_type": "code",+      "metadata": {+        "cellView": "form",+        "colab_type": "code",+        "id": "tuOe1ymfHZPu",+        "colab": {}+      },+      "source": [+        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",+        "# you may not use this file except in compliance with the License.\n",+        "# You may obtain a copy of the License at\n",+        "#\n",+        "# https://www.apache.org/licenses/LICENSE-2.0\n",+        "#\n",+        "# Unless required by applicable law or agreed to in writing, software\n",+        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",+        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",+        "# See the License for the specific language governing permissions and\n",+        "# limitations under the License."+      ],+      "execution_count": 0,+      "outputs": []+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "qFdPvlXBOdUN"+      },+      "source": [+        "# Gradient Decode Dicom Tensorflow Operation Example"+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "MfBg1C5NB3X0"+      },+      "source": [+        "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",+        "  <td>\n",+        "    <a target=\"_blank\" href=\"https://www.tensorflow.org/io/tutorials/dicom\"><img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />View on TensorFlow.org</a>\n",+        "  </td>\n",+        "  <td>\n",+        "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/io/blob/master/docs/tutorials/dicom.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",+        "  </td>\n",+        "  <td>\n",+        "    <a target=\"_blank\" href=\"https://github.com/tensorflow/io/blob/master/docs/tutorials/dicom.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />View source on GitHub</a>\n",+        "  </td>\n",+        "      <td>\n",+        "    <a href=\"https://raw.githubusercontent.com/tensorflow/io/master/docs/tutorials/dicom.ipynb\"><img src=\"https://www.tensorflow.org/images/download_logo_32px.png\" />Download notebook</a>\n",+        "  </td>\n",+        "</table>"+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "xHxb-dlhMIzW"+      },+      "source": [+        "## Overview\n",+        "\n",+        "This tutorial shows how to use [dicom](https://github.com/tensorflow/io/tree/master/tensorflow_io/dicom) in TensorFlow IO to decode DICOM files with TensorFlow."+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "MUXex9ctTuDB"+      },+      "source": [+        "## Setup and Usage"+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "id": "4YsfgDMZW5g6",+        "colab_type": "text"+      },+      "source": [+        "#### Download DICOM image\n",+        "\n",+        "Note: The `CR-MONO1-10-chest` file used in this toturial is downloaded from: https://barre.dev/medical/samples/"+      ]+    },+    {+      "cell_type": "code",+      "metadata": {+        "id": "Tu01THzWcE-J",+        "colab_type": "code",+        "colab": {}+      },+      "source": [+        "!curl -o CR-MONO1-10-chest.gz -L https://www.dropbox.com/s/yw9551g5cqaxdn2/CR-MONO1-10-chest.gz?dl=1\n",+        "!gunzip CR-MONO1-10-chest.gz\n",+        "!ls -l CR-MONO1-10-chest"+      ],

Thanks @MarkDaoust, I have changed the PR to use another file from NIH Chest X-ray dataset, provided in https://cloud.google.com/healthcare/docs/resources/public-datasets/nih-chest

As was mentioned in the page, there is a attribution to the citation requirement, so I also added the citation and the link.

The file is stored in Google Cloud's public dataset in gcs. I saved a copy in this repo, conforms to the license requirement I think.

yongtang

comment created time in a day

Pull request review commenttensorflow/io

Move Dicom's documentation to docs/tutorials (tensorflow.org/io)

+{+  "nbformat": 4,+  "nbformat_minor": 0,+  "metadata": {+    "colab": {+      "name": "dicom.ipynb",+      "provenance": [],+      "collapsed_sections": [+        "Tce3stUlHN0L"+      ],+      "toc_visible": true+    },+    "kernelspec": {+      "name": "python3",+      "display_name": "Python 3"+    },+    "language_info": {+      "codemirror_mode": {+        "name": "ipython",+        "version": 3+      },+      "file_extension": ".py",+      "mimetype": "text/x-python",+      "name": "python",+      "nbconvert_exporter": "python",+      "pygments_lexer": "ipython3",+      "version": "3.6.3"+    }+  },+  "cells": [+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "Tce3stUlHN0L"+      },+      "source": [+        "##### Copyright 2019 The TensorFlow IO Authors."+      ]+    },+    {+      "cell_type": "code",+      "metadata": {+        "cellView": "form",+        "colab_type": "code",+        "id": "tuOe1ymfHZPu",+        "colab": {}+      },+      "source": [+        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",+        "# you may not use this file except in compliance with the License.\n",+        "# You may obtain a copy of the License at\n",+        "#\n",+        "# https://www.apache.org/licenses/LICENSE-2.0\n",+        "#\n",+        "# Unless required by applicable law or agreed to in writing, software\n",+        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",+        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",+        "# See the License for the specific language governing permissions and\n",+        "# limitations under the License."+      ],+      "execution_count": 0,+      "outputs": []+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "qFdPvlXBOdUN"+      },+      "source": [+        "# Gradient Decode Dicom Tensorflow Operation Example"

Thanks @lamberta. The PR has been updated with name changed to use # Decode DICOM files for medical imaging

yongtang

comment created time in a day

push eventyongtang/io

Yong Tang

commit sha dfb3d53e507199fe7ab05a18152dfec2213ca573

Update toc to use `Decode DICOM files for medical imaging` Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in a day

push eventyongtang/io

Yong Tang

commit sha 27e243f9c66081ef85ce2dfea6c72c612b1b97f6

Update dicom file Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

Yong Tang

commit sha 9a089b46a3a1952cb3f98dc155b474b58d4e0cbf

Update to use NIH Chest X-ray dataset, added the attribution link per dataset usage requirement Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in a day

create barnchyongtang/io

branch : dicom2

created branch time in a day

issue commenttensorflow/io

Enable CPU instructions when building the binary.

@vlasenkoalexey Thanks! 👍

yongtang

comment created time in a day

pull request commenttensorflow/io

Move Dicom's documentation to docs/tutorials (tensorflow.org/io)

@lamberta The PR has been updated. Please take a look and let me know if there are any other issues.

yongtang

comment created time in a day

Pull request review commenttensorflow/io

Move Dicom's documentation to docs/tutorials (tensorflow.org/io)

+{+  "nbformat": 4,+  "nbformat_minor": 0,+  "metadata": {+    "colab": {+      "name": "dicom.ipynb",+      "provenance": [],+      "collapsed_sections": [+        "Tce3stUlHN0L"+      ],+      "toc_visible": true+    },+    "kernelspec": {+      "name": "python3",+      "display_name": "Python 3"+    },+    "language_info": {+      "codemirror_mode": {+        "name": "ipython",+        "version": 3+      },+      "file_extension": ".py",+      "mimetype": "text/x-python",+      "name": "python",+      "nbconvert_exporter": "python",+      "pygments_lexer": "ipython3",+      "version": "3.6.3"+    }+  },+  "cells": [+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "Tce3stUlHN0L"+      },+      "source": [+        "##### Copyright 2019 The TensorFlow IO Authors."+      ]+    },+    {+      "cell_type": "code",+      "metadata": {+        "cellView": "form",+        "colab_type": "code",+        "id": "tuOe1ymfHZPu",+        "colab": {}+      },+      "source": [+        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",+        "# you may not use this file except in compliance with the License.\n",+        "# You may obtain a copy of the License at\n",+        "#\n",+        "# https://www.apache.org/licenses/LICENSE-2.0\n",+        "#\n",+        "# Unless required by applicable law or agreed to in writing, software\n",+        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",+        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",+        "# See the License for the specific language governing permissions and\n",+        "# limitations under the License."+      ],+      "execution_count": 0,+      "outputs": []+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "qFdPvlXBOdUN"+      },+      "source": [+        "# Gradient Decode Dicom Tensorflow Operation Example"+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "MfBg1C5NB3X0"+      },+      "source": [+        "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",+        "  <td>\n",+        "    <a target=\"_blank\" href=\"https://www.tensorflow.org/io/tutorials/dicom\"><img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />View on TensorFlow.org</a>\n",+        "  </td>\n",+        "  <td>\n",+        "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/io/blob/master/docs/tutorials/dicom.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",+        "  </td>\n",+        "  <td>\n",+        "    <a target=\"_blank\" href=\"https://github.com/tensorflow/io/blob/master/docs/tutorials/dicom.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />View source on GitHub</a>\n",+        "  </td>\n",+        "      <td>\n",+        "    <a href=\"https://raw.githubusercontent.com/tensorflow/io/master/docs/tutorials/dicom.ipynb\"><img src=\"https://www.tensorflow.org/images/download_logo_32px.png\" />Download notebook</a>\n",+        "  </td>\n",+        "</table>"+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "xHxb-dlhMIzW"+      },+      "source": [+        "## Overview\n",+        "\n",+        "This tutorial shows how to use [dicom](https://github.com/tensorflow/io/tree/master/tensorflow_io/dicom) in TensorFlow IO for decome DICOM files with TensorFlow."+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "MUXex9ctTuDB"+      },+      "source": [+        "## Setup and Usage"+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "id": "4YsfgDMZW5g6",+        "colab_type": "text"+      },+      "source": [+        "#### Download DICOM image\n",+        "\n",+        "Note: The `CR-MONO1-10-chest` file used in this toturial is downloaded from: https://barre.dev/medical/samples/"+      ]+    },+    {+      "cell_type": "code",+      "metadata": {+        "id": "Tu01THzWcE-J",+        "colab_type": "code",+        "colab": {}+      },+      "source": [+        "!curl -o CR-MONO1-10-chest.gz -L https://www.dropbox.com/s/yw9551g5cqaxdn2/CR-MONO1-10-chest.gz?dl=1\n",+        "!gunzip CR-MONO1-10-chest.gz\n",+        "!ls -l CR-MONO1-10-chest"+      ],+      "execution_count": 0,+      "outputs": []+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "id": "upgCc3gXybsA",+        "colab_type": "text"+      },+      "source": [+        "### Install required Packages, and restart runtime"+      ]+    },+    {+      "cell_type": "code",+      "metadata": {+        "id": "uUDYyMZRfkX4",+        "colab_type": "code",+        "colab": {}+      },+      "source": [+        "# Note: change to tensorflow-io\n",+        "!pip install tensorflow-io-nightly"+      ],+      "execution_count": 0,+      "outputs": []+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "id": "yZmI7l_GykcW",+        "colab_type": "text"+      },+      "source": [+        "### Decode DICOM image"+      ]+    },+    {+      "cell_type": "code",+      "metadata": {+        "id": "YUj0878jPyz7",+        "colab_type": "code",+        "colab": {+          "base_uri": "https://localhost:8080/",+          "height": 318+        },+        "outputId": "9afb15f4-d5d0-4f8d-f4fb-f876d16f5edc"+      },+      "source": [+        "%tensorflow_version 2.x \n",+        "\n",+        "import matplotlib.pyplot as plt\n",+        "import numpy as np\n",+        "import tensorflow as tf\n",+        "import tensorflow_io as tfio\n",+        "\n",+        "image_bytes = tf.io.read_file('CR-MONO1-10-chest')\n",+        "\n",+        "image = tfio.image.decode_dicom_image(image_bytes, dtype=tf.uint16)\n",+        "\n",+        "skipped = tfio.image.decode_dicom_image(image_bytes, on_error='skip', dtype=tf.uint8)\n",+        "\n",+        "lossy_image = tfio.image.decode_dicom_image(image_bytes, scale='auto', on_error='lossy', dtype=tf.uint8)\n",+        "\n",+        "\n",+        "fig, axes = plt.subplots(1,2, figsize=(10,10))\n",+        "axes[0].imshow(np.squeeze(image.numpy()), cmap='gray')\n",+        "axes[0].set_title('image')\n",+        "axes[1].imshow(np.squeeze(lossy_image.numpy()), cmap='gray')\n",+        "axes[1].set_title('lossy image');"+      ],+      "execution_count": 3,+      "outputs": [+        {+          "output_type": "display_data",+          "data": {+            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlYAAAEtCAYAAADKqC6AAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOy9e7Csa17f9X26e133ZeacYc5xZhhA\nYKAQTAwK4Y9YQcAJRBRjWaNEI1LoEEvKiqEUEqMSjIhlKqaolIaJRZiIXMtQYIKBCUmU0hAJiZIA\nKgMFwpwzlwMzZ6+9Lr1Wr378o9f37c/77eftXmvvffZZZ9O/qlXd6+33fS6/5/f7/i7P5S21Vm1p\nS1va0pa2tKUtbenxafR6N2BLW9rSlra0pS1t6VmhrWO1pS1taUtb2tKWtvSEaOtYbWlLW9rSlra0\npS09Ido6Vlva0pa2tKUtbWlLT4i2jtWWtrSlLW1pS1va0hOirWO1pS1taUtb2tKWtvSEaOtYbemR\nqJTy86WUL36927GlLW3ptxeVUn61lPJlt6Adf7yU8t+93u3Y0u2jyevdgC29ManW+rmvdxu2tKUt\nben1olrrt73ebdjS7aRtxmpLW9rSlra0pS1t6QnR1rHa0iOR0/GllG8ppfxQKeV7SilHpZR/UEr5\nrFLKHyulfLSU8uullHfjua8tpfzi1b2/Ukr5+ij3PyylvFxKeamU8m+VUmop5TOvftsrpfzpUsr/\nV0r5SCnlz5dSDp5237e0pS3dDrrChD97hRcvXX3fu/rtk0opf6WU8olSym+VUn6qlDK6+u2bSikf\nusKh/6eU8qWllH+klHJSSnkLyv/8UsrHSik7jbq/pZTyPVffP+0Kq772CvM+Xkr5w6WULyil/NxV\nG/4cnv2MUsrfKKX8ZinllVLK/1BKeXPU+/ev2vdDpZQfKKX8Kfz+laWU//Oq3P+9lPI7XhsOb+lR\naOtYbelJ0D8v6b+X9Jykvy/px7WQrXdI+lZJ34l7PyrpKyXdl/S1kv7rUsrnS1Ip5csl/VFJXybp\nMyV9cdTz7ZI+S9I/cfX7OyT9J69Fh7a0pS29Ieg/kvRFWmDC75T0hZL+xNVv3yjpNyS9VdKLkv64\npFpK+WxJ3yDpC2qt9yT9Pkm/Wmv9sKS/Jek9KP8PSfr+WuvFNdvzuyW9S9K/IunPXrXvyyR9rqT3\nlFJ+79V9RdJ/Ientkj5H0jslfYsklVJ2Jf2wpO+W9Lyk75P0B1xBKeV3SfouSV8v6S1a4OuP2qHc\n0utPW8dqS0+CfqrW+uO11pmkH9ICyL79Coy+X9KnORqrtf7VWusv1wX9L5J+QtI/fVXOeyT9xVrr\nz9daT3QFNJJUSimS3ivp36+1/lat9UjSt0n6V59SH7e0pS3dPvrXJH1rrfWjtdaPSfqTWjhDknQh\n6W2SPrXWelFr/am6eDnupaQ9Sf9YKWWn1vqrtdZfvnrm/ZL+dUkqpYwlfbUWQeN16T+rtZ7VWn9C\n0rGk77tq24ck/ZSk3yVJtdYP1lo/UGudXrX7z0iy0/VFWqx//o6rdv9lSf8H6nivpO+stf6dWutl\nrfX9kqZXz23pFtDWsdrSk6CP4PuppFdqrZf4X5LuSlIp5StKKT99lZr/hKTfL+mTru55u6RfR1n8\n/lZJh5J+9ir9/QlJf+3q+pa2tKXfnvR2Sb+G/3/t6pok/VeSPijpJ66WHXyztHBqJP0RLQK3j5ZS\nvr+U4md+RAuH6x+V9M9KerXWSqdmEyUW5v/GwRev6v1QKeWBpO9RHwc/dOUEmoiFnyrpG42DV1j4\nTvR7S68zbR2rLT01ukpV/4+S/rSkF2utb5b0Y1qkxSXpZUmfjEfeie+vaAFMn1trffPV35tqrXef\nQtO3tKUt3U56SQtHw/QpV9dUaz2qtX5jrfXTJf0Lkv5oKeVLr3773lrr77l6tkr6L6+un0n6QS2y\nVn9IN8tW3YS+7aref7zWev+qPuLgO66y9CZi4a9L+s+Bg2+utR7WWr/vNWrrlm5IW8dqS0+TdrVI\nwX9M0qyU8hWS3o3ff1DS15ZSPqeUcijpP/YPtda5pL+gxZqsFySplPKOUsrve2qt39KWtnTb6Psk\n/YlSyltLKZ+kxZpLLyj/ylLKZ145KK9qMQU4L6V8dinlS64CvTMtArY5yvxLkv5NLZyx18qxuifp\noaRXSynvkPQf4Le/fdXWbyilTEopX6XF2jHTX5D0h0spv7ss6E4p5Z8rpdx7jdq6pRvS1rHa0lOj\nq3VR/54WDtTHJf1BST+K3/9nSd8h6W9qkcL/6aufplef3+TrV+nzvy7ps59K47e0pS3dRvpTkv6u\npJ+T9A8k/b2ra9JiEflf18KB+duS/pta69/UIrj7di2y4B+W9IKkP+YCa63/mxaO1t+rtXKa8UnS\nn5T0+Vo4fH9V0l9G/eeS/iVJXyfpE1pks/6KrnCw1vp3Jf3bkv6cFjj6QS0cwS3dEir9adwtben2\nUCnlcyT9Q0l7Vwvjt7SlLW3pNadSyt+Q9L211ltxsnop5e9I+vO11r/4erdlS5tpm7Ha0q2iUsof\nuDqb5jkt1j38T1unaktb2tLTolLKF2iRTfqB17ENv/fqXK1JKeVrJP0OLTbrbOkNQK+ZY1VK+fKr\ng9c+6N0YW9rSNejrtTjr6pe1WGfw77y+zdnSb0fa4tdvTyqlvF+L6cM/crV04fWiz5b0f2kxFfiN\nkv7lWuvLr2N7tnQDek2mAq/O//h/tdiu+huSfkbSV9daf+GJV7alLW1pS0+Qtvi1pS1t6XHotcpY\nfaGkD9Zaf+VqId73S/qq16iuLW1pS1t6krTFry1taUuPTK+VY/UO9Q80+42ra1va0pa2dNtpi19b\n2tKWHpkmr1fFpZT3anE0v+7cufNP1lp1enrauk/j8Vjj8VilFPnMtP7ZaRq8ltdv8tym367z+6Pc\nu6mN+Xvy5FH72yo3y2r9X2ttPjufz+WpZk45+xmWwedZXq11pQx+stzWtHbr97xv6Lmheofasq6e\nde28zm/XKctt5t9toJSNz/u8z9Pu7q5+9md/9pVa6xv25PynhWFD+r7p2nV+u+49N8G5ofsfFbce\nlU++9iQwzN/526NgWP5/XQxzeY+LYa3vWwzbTC0Me+mll/TKK680FeO1cqw+pP5JsZ98da2jWuv7\nJL1PknZ2dqokjcdjvelNb9Lh4aHe9KY3aTKZdIA0Go00Gi0TbBTk0WikUkr3OwGM100uqwVyyUDf\nx3rX3b8ONF2eiYrK/qWisp9su/vq/o5Go45X4/G4U0be7//ZjuQP+e2yWNdkMlGttbvPv9VaNRqN\nut9OTk50ebl4s81sNtN4PNZ8PtdoNOo+R6OR9vb2uj7UWjWfz3tANp/PdXFxodls1inbxcWF5vN5\nB3z+Li0V1f/PZjNdXl529bpN/O7/8+/y8rIr//LycuVZ18/vfN7/56e/+3+32+XzN16fzWa9vpIn\nbGetVbPZTBcXF5pOp722J7WMCvk4REMGqXUfv//CL/yCPvCBD+hLvuRLXqszgh6XNuKXNIxh9+/f\n1507d26MYanXxK8WLiWGuUx+8n7ek1hz1Z+1jkaWY7Is3gTD3IZaqyaTiSaTSXf/OgwzxhB7sr8s\n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\n2KBgMLIDhxwZvJZ0MOs0Lxmvo3RPsXOtnSr3n9

@lamberta Updated the PR and removed the output cells.

yongtang

comment created time in a day

Pull request review commenttensorflow/io

Move Dicom's documentation to docs/tutorials (tensorflow.org/io)

+{+  "nbformat": 4,+  "nbformat_minor": 0,+  "metadata": {+    "colab": {+      "name": "dicom.ipynb",+      "provenance": [],+      "collapsed_sections": [+        "Tce3stUlHN0L"+      ],+      "toc_visible": true+    },+    "kernelspec": {+      "name": "python3",+      "display_name": "Python 3"+    },+    "language_info": {+      "codemirror_mode": {+        "name": "ipython",+        "version": 3+      },+      "file_extension": ".py",+      "mimetype": "text/x-python",+      "name": "python",+      "nbconvert_exporter": "python",+      "pygments_lexer": "ipython3",+      "version": "3.6.3"+    }+  },+  "cells": [+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "Tce3stUlHN0L"+      },+      "source": [+        "##### Copyright 2019 The TensorFlow IO Authors."+      ]+    },+    {+      "cell_type": "code",+      "metadata": {+        "cellView": "form",+        "colab_type": "code",+        "id": "tuOe1ymfHZPu",+        "colab": {}+      },+      "source": [+        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",+        "# you may not use this file except in compliance with the License.\n",+        "# You may obtain a copy of the License at\n",+        "#\n",+        "# https://www.apache.org/licenses/LICENSE-2.0\n",+        "#\n",+        "# Unless required by applicable law or agreed to in writing, software\n",+        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",+        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",+        "# See the License for the specific language governing permissions and\n",+        "# limitations under the License."+      ],+      "execution_count": 0,+      "outputs": []+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "qFdPvlXBOdUN"+      },+      "source": [+        "# Gradient Decode Dicom Tensorflow Operation Example"+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "MfBg1C5NB3X0"+      },+      "source": [+        "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",+        "  <td>\n",+        "    <a target=\"_blank\" href=\"https://www.tensorflow.org/io/tutorials/dicom\"><img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />View on TensorFlow.org</a>\n",+        "  </td>\n",+        "  <td>\n",+        "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/io/blob/master/docs/tutorials/dicom.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",+        "  </td>\n",+        "  <td>\n",+        "    <a target=\"_blank\" href=\"https://github.com/tensorflow/io/blob/master/docs/tutorials/dicom.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />View source on GitHub</a>\n",+        "  </td>\n",+        "      <td>\n",+        "    <a href=\"https://raw.githubusercontent.com/tensorflow/io/master/docs/tutorials/dicom.ipynb\"><img src=\"https://www.tensorflow.org/images/download_logo_32px.png\" />Download notebook</a>\n",+        "  </td>\n",+        "</table>"+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "xHxb-dlhMIzW"+      },+      "source": [+        "## Overview\n",+        "\n",+        "This tutorial shows how to use [dicom](https://github.com/tensorflow/io/tree/master/tensorflow_io/dicom) in TensorFlow IO for decome DICOM files with TensorFlow."+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "MUXex9ctTuDB"+      },+      "source": [+        "## Setup and Usage"+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "id": "4YsfgDMZW5g6",+        "colab_type": "text"+      },+      "source": [+        "#### Download DICOM image\n",+        "\n",+        "Note: The `CR-MONO1-10-chest` file used in this toturial is downloaded from: https://barre.dev/medical/samples/"+      ]+    },+    {+      "cell_type": "code",+      "metadata": {+        "id": "Tu01THzWcE-J",+        "colab_type": "code",+        "colab": {}+      },+      "source": [+        "!curl -o CR-MONO1-10-chest.gz -L https://www.dropbox.com/s/yw9551g5cqaxdn2/CR-MONO1-10-chest.gz?dl=1\n",+        "!gunzip CR-MONO1-10-chest.gz\n",+        "!ls -l CR-MONO1-10-chest"+      ],+      "execution_count": 0,+      "outputs": []+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "id": "upgCc3gXybsA",+        "colab_type": "text"+      },+      "source": [+        "### Install required Packages, and restart runtime"+      ]+    },+    {+      "cell_type": "code",+      "metadata": {+        "id": "uUDYyMZRfkX4",+        "colab_type": "code",+        "colab": {}+      },+      "source": [+        "# Note: change to tensorflow-io\n",+        "!pip install tensorflow-io-nightly"+      ],+      "execution_count": 0,+      "outputs": []+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "id": "yZmI7l_GykcW",+        "colab_type": "text"+      },+      "source": [+        "### Decode DICOM image"+      ]+    },+    {+      "cell_type": "code",+      "metadata": {+        "id": "YUj0878jPyz7",+        "colab_type": "code",+        "colab": {+          "base_uri": "https://localhost:8080/",+          "height": 318+        },+        "outputId": "9afb15f4-d5d0-4f8d-f4fb-f876d16f5edc"+      },+      "source": [+        "%tensorflow_version 2.x \n",+        "\n",+        "import matplotlib.pyplot as plt\n",+        "import numpy as np\n",+        "import tensorflow as tf\n",+        "import tensorflow_io as tfio\n",+        "\n",+        "image_bytes = tf.io.read_file('CR-MONO1-10-chest')\n",+        "\n",+        "image = tfio.image.decode_dicom_image(image_bytes, dtype=tf.uint16)\n",+        "\n",+        "skipped = tfio.image.decode_dicom_image(image_bytes, on_error='skip', dtype=tf.uint8)\n",+        "\n",+        "lossy_image = tfio.image.decode_dicom_image(image_bytes, scale='auto', on_error='lossy', dtype=tf.uint8)\n",+        "\n",+        "\n",+        "fig, axes = plt.subplots(1,2, figsize=(10,10))\n",+        "axes[0].imshow(np.squeeze(image.numpy()), cmap='gray')\n",+        "axes[0].set_title('image')\n",+        "axes[1].imshow(np.squeeze(lossy_image.numpy()), cmap='gray')\n",+        "axes[1].set_title('lossy image');"+      ],+      "execution_count": 3,+      "outputs": [+        {+          "output_type": "display_data",+          "data": {+            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlYAAAEtCAYAAADKqC6AAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOy9e7Csa17f9X26e133ZeacYc5xZhhA\nYKAQTAwK4Y9YQcAJRBRjWaNEI1LoEEvKiqEUEqMSjIhlKqaolIaJRZiIXMtQYIKBCUmU0hAJiZIA\nKgMFwpwzlwMzZ6+9Lr1Wr378o9f37c/77eftXmvvffZZZ9O/qlXd6+33fS6/5/f7/i7P5S21Vm1p\nS1va0pa2tKUtbenxafR6N2BLW9rSlra0pS1t6VmhrWO1pS1taUtb2tKWtvSEaOtYbWlLW9rSlra0\npS09Ido6Vlva0pa2tKUtbWlLT4i2jtWWtrSlLW1pS1va0hOirWO1pS1taUtb2tKWtvSEaOtYbemR\nqJTy86WUL36927GlLW3ptxeVUn61lPJlt6Adf7yU8t+93u3Y0u2jyevdgC29ManW+rmvdxu2tKUt\nben1olrrt73ebdjS7aRtxmpLW9rSlra0pS1t6QnR1rHa0iOR0/GllG8ppfxQKeV7SilHpZR/UEr5\nrFLKHyulfLSU8uullHfjua8tpfzi1b2/Ukr5+ij3PyylvFxKeamU8m+VUmop5TOvftsrpfzpUsr/\nV0r5SCnlz5dSDp5237e0pS3dDrrChD97hRcvXX3fu/rtk0opf6WU8olSym+VUn6qlDK6+u2bSikf\nusKh/6eU8qWllH+klHJSSnkLyv/8UsrHSik7jbq/pZTyPVffP+0Kq772CvM+Xkr5w6WULyil/NxV\nG/4cnv2MUsrfKKX8ZinllVLK/1BKeXPU+/ev2vdDpZQfKKX8Kfz+laWU//Oq3P+9lPI7XhsOb+lR\naOtYbelJ0D8v6b+X9Jykvy/px7WQrXdI+lZJ34l7PyrpKyXdl/S1kv7rUsrnS1Ip5csl/VFJXybp\nMyV9cdTz7ZI+S9I/cfX7OyT9J69Fh7a0pS29Ieg/kvRFWmDC75T0hZL+xNVv3yjpNyS9VdKLkv64\npFpK+WxJ3yDpC2qt9yT9Pkm/Wmv9sKS/Jek9KP8PSfr+WuvFNdvzuyW9S9K/IunPXrXvyyR9rqT3\nlFJ+79V9RdJ/Ientkj5H0jslfYsklVJ2Jf2wpO+W9Lyk75P0B1xBKeV3SfouSV8v6S1a4OuP2qHc\n0utPW8dqS0+CfqrW+uO11pmkH9ICyL79Coy+X9KnORqrtf7VWusv1wX9L5J+QtI/fVXOeyT9xVrr\nz9daT3QFNJJUSimS3ivp36+1/lat9UjSt0n6V59SH7e0pS3dPvrXJH1rrfWjtdaPSfqTWjhDknQh\n6W2SPrXWelFr/am6eDnupaQ9Sf9YKWWn1vqrtdZfvnrm/ZL+dUkqpYwlfbUWQeN16T+rtZ7VWn9C\n0rGk77tq24ck/ZSk3yVJtdYP1lo/UGudXrX7z0iy0/VFWqx//o6rdv9lSf8H6nivpO+stf6dWutl\nrfX9kqZXz23pFtDWsdrSk6CP4PuppFdqrZf4X5LuSlIp5StKKT99lZr/hKTfL+mTru55u6RfR1n8\n/lZJh5J+9ir9/QlJf+3q+pa2tKXfnvR2Sb+G/3/t6pok/VeSPijpJ66WHXyztHBqJP0RLQK3j5ZS\nvr+U4md+RAuH6x+V9M9KerXWSqdmEyUW5v/GwRev6v1QKeWBpO9RHwc/dOUEmoiFnyrpG42DV1j4\nTvR7S68zbR2rLT01ukpV/4+S/rSkF2utb5b0Y1qkxSXpZUmfjEfeie+vaAFMn1trffPV35tqrXef\nQtO3tKUt3U56SQtHw/QpV9dUaz2qtX5jrfXTJf0Lkv5oKeVLr3773lrr77l6tkr6L6+un0n6QS2y\nVn9IN8tW3YS+7aref7zWev+qPuLgO66y9CZi4a9L+s+Bg2+utR7WWr/vNWrrlm5IW8dqS0+TdrVI\nwX9M0qyU8hWS3o3ff1DS15ZSPqeUcijpP/YPtda5pL+gxZqsFySplPKOUsrve2qt39KWtnTb6Psk\n/YlSyltLKZ+kxZpLLyj/ylLKZ145KK9qMQU4L6V8dinlS64CvTMtArY5yvxLkv5NLZyx18qxuifp\noaRXSynvkPQf4Le/fdXWbyilTEopX6XF2jHTX5D0h0spv7ss6E4p5Z8rpdx7jdq6pRvS1rHa0lOj\nq3VR/54WDtTHJf1BST+K3/9nSd8h6W9qkcL/6aufplef3+TrV+nzvy7ps59K47e0pS3dRvpTkv6u\npJ+T9A8k/b2ra9JiEflf18KB+duS/pta69/UIrj7di2y4B+W9IKkP+YCa63/mxaO1t+rtXKa8UnS\nn5T0+Vo4fH9V0l9G/eeS/iVJXyfpE1pks/6KrnCw1vp3Jf3bkv6cFjj6QS0cwS3dEir9adwtben2\nUCnlcyT9Q0l7Vwvjt7SlLW3pNadSyt+Q9L211ltxsnop5e9I+vO11r/4erdlS5tpm7Ha0q2iUsof\nuDqb5jkt1j38T1unaktb2tLTolLKF2iRTfqB17ENv/fqXK1JKeVrJP0OLTbrbOkNQK+ZY1VK+fKr\ng9c+6N0YW9rSNejrtTjr6pe1WGfw77y+zdnSb0fa4tdvTyqlvF+L6cM/crV04fWiz5b0f2kxFfiN\nkv7lWuvLr2N7tnQDek2mAq/O//h/tdiu+huSfkbSV9daf+GJV7alLW1pS0+Qtvi1pS1t6XHotcpY\nfaGkD9Zaf+VqId73S/qq16iuLW1pS1t6krTFry1taUuPTK+VY/UO9Q80+42ra1va0pa2dNtpi19b\n2tKWHpkmr1fFpZT3anE0v+7cufNP1lp1enrauk/j8Vjj8VilFPnMtP7ZaRq8ltdv8tym367z+6Pc\nu6mN+Xvy5FH72yo3y2r9X2ttPjufz+WpZk45+xmWwedZXq11pQx+stzWtHbr97xv6Lmheofasq6e\nde28zm/XKctt5t9toJSNz/u8z9Pu7q5+9md/9pVa6xv25PynhWFD+r7p2nV+u+49N8G5ofsfFbce\nlU++9iQwzN/526NgWP5/XQxzeY+LYa3vWwzbTC0Me+mll/TKK680FeO1cqw+pP5JsZ98da2jWuv7\nJL1PknZ2dqokjcdjvelNb9Lh4aHe9KY3aTKZdIA0Go00Gi0TbBTk0WikUkr3OwGM100uqwVyyUDf\nx3rX3b8ONF2eiYrK/qWisp9su/vq/o5Go45X4/G4U0be7//ZjuQP+e2yWNdkMlGttbvPv9VaNRqN\nut9OTk50ebl4s81sNtN4PNZ8PtdoNOo+R6OR9vb2uj7UWjWfz3tANp/PdXFxodls1inbxcWF5vN5\nB3z+Li0V1f/PZjNdXl529bpN/O7/8+/y8rIr//LycuVZ18/vfN7/56e/+3+32+XzN16fzWa9vpIn\nbGetVbPZTBcXF5pOp722J7WMCvk4REMGqXUfv//CL/yCPvCBD+hLvuRLXqszgh6XNuKXNIxh9+/f\n1507d26MYanXxK8WLiWGuUx+8n7ek1hz1Z+1jkaWY7Is3gTD3IZaqyaTiSaTSXf/OgwzxhB7sr8s\nv4Vhrm8+n3djY8xy+S7n5OSk08GLiwvt7Ozo8vJS4/G4+xyNRtrd3d2IYdZH/05dHsKwxLvrYBhx\noIVhWd9stth0vQ7Dsn2893EwzNeHMMy438IwOppDxN9vGhyQUs9+8Rd/UZ/+6Z8+eP9r5Vj9jKR3\nlcX7lj6kxYty/+DQzaUUvetd79Lu7q4mk0lPIfx7KqakzlBbKQlALSfLZZHS6Rj6JNCkEg/1aR1Z\nga3crSiK13hPgp5Bgc/zHtfh39hnRgXZZgImyyKgpODagaGy8Dd/8rmLi4teWb5H6isw62c/qfDk\nCcszkGY/PQbXcRCyv61IlobA7aJBMJCwLAKTZdq/mVe+bkA3L+zkmk++p9aqnZ0d7e3t6eDgoOPb\nxcWFLi8vNZ1OVzKKKVObaCh6HiLK5bvf/e7ND7x+dCP8khZ9+6zP+izt7Oz0MExa6s+Qc8F7Whi2\nKRCi00E95yfbmc/m7+t0IY2Z5ToxdhOGsTzqx1A7iJNZ15AM+znySFKHQ+ZrZqKGMGw0Guni4kKl\nlC6gcXl0BFmOf2c5LQxr6VBiWJZvSgxbp4/GHT5vDGG9iWG8Rn7QccwxGMIwY7Gdup2dnZWAlhg2\nn891eHjYC7AvLy91fn4+GCyy/tb/Q3zKtuf/pF/6pV8arPs1caxqrbNSyjdI+nFJY0nfVWv9+aH7\nd3d3df/+/RVHKkGHoEElbWVyGPlRaVsOTF43DT3j36i0V/1eARf/bi89B8xOYZbPZ1tAlfVQ8LPN\nLmNnZ2elXEYUrTbYcUhnTJJ2dna6CMzlsD9+1oZ/NputZLjSqaFxcCTl9mbkxOc4Hn6ekVrylI6t\niRG77/e9dpAYRUvqrvN/t5NyTAAiEFKG3HdGfHS0yOOMBAlO5tu6qNPRH0GK/N4E0I9CQw78baOb\n4pe0wLB79+6t6J8/d3Z2JA1nojYFk77WytKkA2Nah1/EDV6/DoaRsk2tvg8Fr0NysA7Ddnd3V65R\nP6WF3Jvf6zDMmLgOw+xMUbcSw1y+iRhGXW7h6pAz5OcZnLkct2sThtGJcn0tDONzDAT5bGI0Mczt\nZN+HHC3iVq21wzJeNyax//5td3e3d82O1nw+b2IYeUYawrYhvvCZdeWaXrM1VrXWH9PiBbsbKZ0o\nf9KhomORAJRp4fydn61rQ2CVbUwBa9VB5fa1lkOV9bXKa4Fsq4yhay6jlNJNSWT2iopmoUwnjk4s\nM2MGKyo7ga7VPipiC9zdnoxEEmBa/WXbfM94PO71i0CUThTb4ft8PZ/Lz3SiCOaWGU5HJjCyLjqd\nLQeOv11eXmoymXT3rJvapPPtCJuRoVPu2Z4nSalDt5Vugl9SG8OkZeDE6XrfswnDhnAgsztZZ8tp\nSTlvyXA+28KwIYcs23FdbF13f5Izgb6P7UkMy7KIYWnMiWGczvO1DLhugmHp2AzxgfW3+u1+tTJs\nObapX8ScVhvoJBF7+DwxjHKc+GD7YkfctoeYkhjGcch7iI+JYX6GGHZxcaHz8/Mu4GzREK4l/3L8\nybdNuPi6LV5PcjYlQYjXEriojP7zYGxSeH9f53gN/X8dYoYlBX1TnZn6X+dM8FpOe+Z9vu6pPApQ\nKYto0ArhdljRR6NR55y5rvPz8+43Sb1MirQ07I5AqDRWUoKUy/HUIMEwldGKNR6Pu3UPLsdl2uFw\nX1sK4vanIyhtjg4TXAyeqbgtJ4ntdDm8xjEiyGf2aWdnZyUblfxnfbk2I5+9c+dOb9w8deio/XGd\nrZZT8KzQ7u7uCm7dBMNS3tc5IPz+NDEsZXYdhrX6kgY9eUB8yLKIG36O7RqNRh2GWbaJYTbytC8X\nFxe9NqbOcb3iJgyjXhjDJpPJSlvonBDDUrfJB2awWAZ5tC6YXYdhxF7z0lkgltEK9FIeiP/pOCbu\n8d7EIWO3x8A2iWPi77u7u72MF8fMf8awoYCA14m3Q3qzSZ9uhWNlo57gk8Dk/zOaaymmn299st6W\nd99qHz/TaJJaBpr1rDMqBN0hsGy11ZkHXzMPfT8FrjWfzrLs+fs7gcvKRLCgcs1msy5CPz8/13w+\n1/7+vqbTaWeg2Se2P3lo0HJfLi4uVhYA0+C3iEY85Udagp+vWwEJsgTFrCedX7fXfeB0gL9nFOZ7\nWR6BjgBiXlHxWwtFyT+Xl6BNAOL6rJaT5j9OH3J9Q8rBJkqdexaolMW0EoM8X08ck7Sio7zHz637\nZL03xbAcp6eBYZn1ybVgiePUdTowxie2sdUfGmbyx1N5dr7YBhtjP+tpJmMYl3OkAzi0RMBZamMY\nZcPZdGNYOmhue2Y2ub7V/VmHYS6rpXMtDCPG+1njGR0OYiLHg5uU2I8MDvPZDPzcHi5zeBQM83c6\nx4lhaWevg2XrMOzWOFZO8zL6oLJx91tGPQk6LGcIkEwpBENANiSY/D0HIz12tm/ISLeybS1KcDO/\nvOtFWgpwRhNWQAI7Fcb3pOLM53Pt7e11YMG+mZz+9dhcXl7q4OBAZ2dnvUXqVmCXb0CjkU4BJ2h5\n8Wg6jwlOGdnxGaeOCWqtuikLmSrP35hpcn2c2hySUYKO+U6HNqcvWC/HiPz1My7P132Py7cOcG0W\nwZnRrndUTSaTbk0DneyUh5Yj8Kw5VdKjYVjLyeCzj4thJur/08Cwm44xy0wMsxwySCG2tJw3SYMY\nZhlO3KMTQ131NNbh4aHOzs56+mPMom5lmUMYJknT6bSHR+mAmFqbXShXQ+t3+b3lBCaGZQae9xCT\n/H/2KzEsees/4iTLZluYuUoMo2OV45/ZrLRndqwsY8SwlMmWczWEc0m3wrEajUba39/vgYmkHuMZ\nKaVD5WupzAlYUhtcWrvy8j7/T+HKeynYGc0bKPhsKwJo1W0e8Dun5Jz+NlHBaRz5m6fPkm90mjwu\nGR2m8qfSjEYj7ezsdFkrSd2RChZk82g0Gun8/Lx7jmluOhdWCkaAdAZyrNx+OnNUfPPEfLCyGexa\nvCEAsv0pI3TqTMwU0iAMRam8NyO/1n0EwVprN0XINvD/1vdWBMgNABklereho+6zs7NeG9bRuqzH\nG5GsK5J6jrSXOGR2Np0rXiMNYZivte7z55DhM6VRfxIYxnZm3zI7QlxvYViLx5K6nWR2KJM3xgs/\nwwXvvsf6ng6NrxsbnGmvtQ5i2Hg87tb22Am0HlDXnaHyM5xyJ3EcmK1PfXVdbkdiWAZOdI44pdjK\nlLfkKO1ESybJ+xYO0k5wLHJs+D0x5ToYZjkZwjB/Pzg46OwKMWwoCMlxGqJb41jdvXt3ZYEho5Zk\nMp9NJUnlbkV96yIJ/p9CR6Uh0fHyc1SqjBpb7eFfq82tqYMEDSttK1KR+qBP5yX/3I/pdNoBzd7e\nXs/pZT28vru7q1dffbUT6jT4e3t7vfNcSimdA+TUr0GDCuNrXttFh6vl8JkXBIEEEiu5f3NGTlK3\n/sK8yqiNkV+WSaKi1ro6TWH5JZ/Iz5ZD5XIpf+uctCybUR+/E5Rajlb++be9vT0dHh72AIr8Iw1F\ng29kGo1G3a5AYlgavjQkfvYmGGZq/Z+4QWfFckr+p9Gi7mcgmfW1HC32v9WW7Nc6DGPWI3HU5+Kx\n7dkW9s3Yvbe312vrJgyz0aWuGMNouCV1DpAzLS6ftsvtn06nvbal8+FPOkDkGzN45DsxLHdxEsPM\n2yEMo2Oa+JXXyetsv/vHMUoMy3FcF0BmndfFMP//uBjWCohadCscK0dDeYaVBSEPkPQzGVElI9fR\nkGfeiuBo5P1syzBkBqPlhCVIZYSV7cupBbeFi5a5RokLM00tgOPcdQILn6NxnU6n3ToS1s3MUkYi\nVhxuU661dhGq+b27u6u9vb2VqJZKQSeN4E9gaqWovauGspNyZL56DO3cpUxlFEg5YVRow8Br5BPb\n2prCaUVym75zzIbKSIBKByvXZTma5kGkNDZDIHVwcNCN2cnJSW/qtiXvb3Sy/HANDPWV/7cwzNTC\nsJx2o4yRLE8J+sQw/u9neC0DQ051uc1ZNuU5nazWNUldxqmFYa0ZCpP7bV0lhrEt2T4GisaedBIS\nw1xfK7tjBysxbH9/v9dej3GtdcUR24RhdGwTw/w8sScxzPbUmTRm991PBp0tDLOuUr/df8oT15Zm\nGzkWeT1lmOX7c10AmcGK+cyxSwyT1HM812GYM5anp6crmcV1dGscKwt7ZlsITq3si6nW2tvWSWGW\n+rsf0rlJkGG7hjzTliJne1rPplHMOoaiP/LBuyAYgWT0SICkglpRCCzuR6u/FMRSSnf6MDNFrp9O\nmIlZRtdhxXd9bksaCwMNM1bkeUbXroPZxVprl+HiuJFPbgt3CEnLiLw13ciy2H7znJnAHNs0rulk\ntwxhRp45Pvw/HRiCdLaRTg7v91i2nEM6CK2MlseUzx4fH98ImN5oZAzjYcW+7vG6LoYlP803BneJ\nk1kX29XCHP7PMjxueS0zW63+b8JTOkxcT5kYxswJnyNesQzeuw5zjWHn5+fdSelcn5QZcpadGMas\nDnXVzp6JgeB1MYz32nE0hrWcVDp8iVXmE6cfc9yI/S0Mo8y0+MuxyfVbQxiWgT/LTrs6hGGsOwME\n10fsygDX97d0zXLJaVQHiNehW+FYjUYjHR4edt/9SYa1lJYAJq0aFXq0POSN5ZiGHKgWcdAt/KPR\nYo0FT4a1srqtZ2dnOjs7GxTazNbwundNMjpxW4Z4lM4DhS0X0Sb4sh3kpR0QRinpuJkHBC2CpaOn\n7KMdKU5XWuhbAt0aMzpsjkrcp3RcCOqprAR7g9PZ2dmKo0Sl5wJz3kPeMPNFXq8bA4J+PpeU5SWg\n8R62x/c5E8pIkMGKtFzcvm49FjMvBwcH3cnJ0+lUR0dHg+1/o9KjYJi0POdqyKgMYRj1NnEkaeg6\nnyGG+SyzIQxzBoRtcz0tDPPfdTAs20yninhGDKNR9bPrMEySzs/Pexknl0sMY1ZjCMN41IsxR1rF\nMGLRprGh3BhHOWbEMPZvE4aNx2OdnZ2t8JcyNzS9SsckndlWPxgE5CcpHbnMzrbqYnnsd2JYC798\n77qlDrXWng2/vLzU/v5+dxTN2dmZHj58uHZm7FY4VqmQzDZQoJmV8fV0Sgg46QlL6hl+MnqdJ+7P\nyWSig4ODjtme5x+NRt2crPviPhiknA3honMPPJ0BtpnTCuyb+cBr5CP7bj65Hyyvxf+W4fbvrCvv\ndduTr/6dmQxHjq3oIp0VKjLvk/rbdhlxeXwo+EPGJ8E/20EDcHh42L2zKnmbssZ+taYNW4CRi0wz\ncn8UaoEa6+arfjIYIWiR72kgDFoEKxoEpuAPDw917949nZ+f66WXXnrkft02sm7RaV+HYdKqQ9Fa\ns5R6KPXfnfmoGCapGyNj1XUxjDiQDn/LwK7DMOsHn6W+mAcsn44eqXWNfGgF45npMF8YSJgSF/yc\nMSDfh9rCB2JW/s/xpXNHSufR/HDWKrMyxDA7/4lhedYW+ZEYxv6Qj8Sr1rUhDMtlLOlYtfqe9iAd\n/HUYlg6XiQE8MYyZLD97eHio+/fv60MfWnl9aEe3wrEiUTEyG2XhSacqn5PUS3/6eRsSL5akJ2th\ns0A5S8S0LiMTrxHwjihfp6N1fHzctSX7xHrYB0Z3PGnYQtpKr/N6rkWTloaNPEonxs+25t3T8aMz\nu7u725vTZnnptKQj2TIa6fjZ2SGxHe6D+0jAM1HhWovBmc3L9tCI1LpYV7Gzs9PLXqUzzzJbQEHF\nT5469Z9TJa128bPlNGY/SS2etnSq5fzaoDOat+G1PuVrQDJCPDw8fKYcK1PL2JuIYbyX/3Oc0mlx\nGV4OIN0cw2jA/V7Di4uLHoYZT2azmY6Pj3sYQ2O5TvZGo1HvvYmum1jlvjgjzLrZ31L67+ajA+K6\n/JudwVwT2cIwf+7u7vayrdTZFu5lxtDUejl9a1x5jRjGNuQzibv8nzhDhyHxybqaGJb9IZ/tVGX7\n03nJJEc6Xikz2b7sI+u5LoYNBf8tDDNG5aYSY9sQhknLwDLXh5FuhWOV0QQHyMxzes/3573pbdsT\n9/+OklKYrQj2yD1HbkCgJ5zCS5Dy79LCAeO6ntb7i5ISDAlkeZ/LSaErZfmKE9aTCy/ZDpZvUHEW\ng3UkwPh3R7y5HsrfXb+n/rIfbq8/6RhmxJEg5P6w7BbPqMAtQ0Xw5bqioWekxSnb0+l0ECjIP8sp\nwZ7OHEGUwDAERi0ZWnetBUycHshnE4T8l+W0drE5mKGhoCxbFhMk3+jEAGIIw1qZZusq9cyUmOby\n/DydEK6hmc1mvcAsdZwGMbOPbvt8vljXQ8xrySPJWGpnZShb0XJM/ElniXXRqUs8ugmGuS7KrTHM\n92cmQ+pjWI6JscuHibYwjAvTWY/7k9iwDsP8mYFpOjRDGOby9/b2ehnKdMhSHtNhZfaqZSda7fb3\nJ4lhrYSD20BnlRjmMfBYUSaNi8YwBgT+7uTDEN0Kx0rSCnOoHLkeSFpuZTazhhapW9DomLk8767z\nd5flyI9RudSf3zYZTChUPCWcAsHBSIfQ50W1FMOU/UrlMhEsMxXvOlN5LFwUuPl83q1DyEiOzlpG\nOW5DjkGOs+9trZVgG3nmFsc4IyZGnFknHW2CXmuenH3NfvHAutFo1DnQ5EsagOQ5+ZxjTQPmehPc\nyL8h4GG7mRUgT1hHAlA6P3YC3G7+nqB1fn7e203mrKb1NLeBPyvUwjC/g5G8X4dhmd2xrI7H495i\nbWKYs1fcvEMMy2nxVlY3s2Oe1koZdvvz2hCGJVE3qLeUcWZd3LbWEgbysqVbxDCW1XJyTNSfIQyj\n3rJ+jnHiRp4W73taGJbjznLY78QwOorpVGVbff3g4GDl1WTmI+2decUp3OTd42BYy3FKDLMO0A7Q\nFnLTQa4B5Ri5fbSTrcwVMcyYyGUObwjHik4UAcqOD6N7qZ+Om0wm2t/f7xZVptKb7IkaiMgwEwVJ\nUmcUyEg6IwQGLnBOQ5/ZDR8vQUGgIqWQu6+sm/dZMFpOkgHe/aFSkk+tjJ+Via8c4nqaVlSUJwG7\nv+wrFYRTtnagWLevecy9eL7lYPIajZSBMkE/swsE/UwHmwi0BwcHvbH1GLbWkaXsUOYykk2jkwdN\nMgPEvvPYEt5PImAyQ5BOpvnBNpmPfM0EjTDBNwMRZ3JbJx0/C5SBoD99dlIGZdRPY1juTF2HYYzK\nmSUnVjJ4JCak80E5Oz09bWIY14l6nNdhmNubTlLqJ7M2dByJacYw84qOFPk0hGHM4LlN1m0b2TTS\nN8Ewyrp13301htGYc8o2McJknKDTkGuhqKMtHngt3nUwLB3txDDajcx0tzCM9QxhWMq65ftxMIx8\noKPKANDjx2ysy2n5AwwojWFDwYN0SxwrgguzPDR4Oc9Lg2jhvXv3bscgMseGwOX4t1ScjH48wBZM\nr0WwkA1tJTXwELhsbAxGmQkzDzICsOIMLTrn2hUCZzp/VhI6MVYOTkeQmOnL09JpRFPI6eW3DATb\n43F13+m8+V47pualn8m1YGdpIXoAACAASURBVK7Lgi9pZaFmKwtl0CVf2Rb3je+W8lh42oXOnsc5\nlTLLT8eW4+N+0ylmu/y/jSxBKAEvASONgWXNZacecgdnrbVbk+JxMkBxqiR1kG3mgvlnhcwfr70k\n2RBlv9ORn0wm2tvb6/jMiNoYxnWQ6Yxke1xHC8Na2ZfMdCeGub3XxTAaK+JY6utNMcyZPrczyyVZ\nP1I+6ZglrjJjm7pL/iaGJW4QnyaTiabTaedcEUPXYdhoNNLp6em1MMw2jm30eirzlQviGXjy0GY+\nT4ziuLR+Z1DJDQZMZqSNHcKwbB9tCp93vSyPdj6Da//PdtIfyJkv/sZxZnayRbfCsZJWU7Q0ICR3\nzArhztKw+Zh6M8bz3jkwVPwUlvSi6fEmmKWBJHjSuGTqP+tKo5zgQX4wLZmg1IommHEzbwmwBuw0\ntsxU7Ozs9E5Jdr2MkPwMIyQKdPaZwMYx95qGVGzymeNnXp2dnen4+LgX6fHVOiTz1BH6wcFBL0PK\nv1JKl72kDDCz6oiespSOco51ZhC4/b6U0jO0LHM0GnVn8bTWSbFsAnfyoRWwcEzsPNPg+bqfp95y\nraIpdcn3PmuUu6tyTNLoW7ZsZJlBOTg46K7PZjMdHBw0MYz8z8wHxzAxjOciscz8lFYxzM7BJgyj\nMWpN5xmzHwXD3B++sooBgXlgjHSf8hBi38PnLL+JYekwXwfD0lakc5LOp7QIBr1pwG0hhrXG9fT0\nVGdnZysY5rb7ub29ve7Ud2bNPGb5tgliITNSpsxIehzWYRhtjoMFZt7YZjqn7DeJGMZ7PF68v5VM\noQ7RDqbN9HOZVW7RrXCs3GguJPP1lkHwwFn4rThcrHlwcNBlIubzeZfqZFlWplQGZ6WYirYQsw6e\nkeR7OKXl8iR1r0BoTYEQeDzQLOfs7KyXqiUYOyPjZ/IdcTlHT6PXOu/DSkl+2JmyM0enNAElM3s2\nNnTQnB2iQpkH6ZyNx+MOCNx3AudotFjndHZ21stSMUJLYMs2+/+joyONx2Pt7+93733zM4zIzBO+\nM8xtTeeJ1zOadyTJNTDz+XLaIo1WAhH1oyVTKZsmj10rs8L2cUq3lOVULCM9lu8y+WoP94n1ZXue\nBeIYJYZJq1ltZyEtPzz2wM8fHh52TlattTuDKPU7sxc2kNSldRhGWVqHYV5u0Ro76wazWtYrYpjv\ndXvtUFpmiGFu/3UwzNedTSOGOWvje4j/mYlwnd7tTQyjA9sKenk9MYybmdZhmOswhtW6yJTfFMN2\nd3e7c9XScTb+2skawrC0a63MkMviuU+WwXUYls5XYlgGcOvGLuUwg9khDPP6xyEM80HclLnWVHaL\nboVjJalLLXuwMvoitRbbmdE0VFYoR/dSe12VnShJXdTYEn5nbVzObDbr1td4MLi42UppA591MoL3\nS6gl6eTkpLcFmu0gDxh52uExeBmgc5rLfXT9VgArk19bwz7z5aLms9vEBYPS8gyY/f193b17t+uP\nHUPznlNNLjen/1g+DQSVYDqddiAkLQDJQJRtszJkpE3n2uM0nU41mUx6hwiyDZYFvz+Rxy+QvwQq\nAvD+/n7HfwKy+UBHzs4UjQUp9YRglP1jfQRl/2ZiBoH/u3z+TafTnnwTUBPU7ty50zwo8VkgTv8k\n6Lb0V+pP2Un9tw14mtVZFsta6p75zTWIlNN1GGanh2UQD+zsGMNaskUM87PXwTAbY99j3tmBdIa/\nNb2aOsbn6Tz4Hu9wpOPqNvGMolJKh637+/u6d++eJOn4+Ljn7CSGGbMSw9wuYl8afmOYy/IhrIlh\n6URtwjDbI+KH67TNs3y5HcSwVsDLoNryaL4+LoZZTlJemBXjrA+dWvMkx51j6/89JuaF7SiXeiSG\nORC+vLzsMKzVD9Otcayk5RRYeuSmTAXSYPIZO2fz+Vynp6e9DIkNCMHCZfGPAuQ66K2TbICYKjWA\n0SPO6NIesBei+s3aXnCYQuZynd5Ob56KTk+bgGfhp9KaZz6N2GVxgZ55bAewNQaMVmmUrVgGN7fL\nPPC9VFRGEa0+WUlooNgfAifHLGWL48s0sIHN7cn1C2yXjZ4VM+Uks3v8jcBj8Dk6Our4madDZ+q9\nRbx3CHzpKNPhtGxt2r1HvvpdnjZI5Kv5eXl52a114e62Z404nU6cyKwlHQPyixjmsk5OTrrF7Rwv\nZp0Sv26CYX5pL58hhjEgzKljY4ox7OTkZBDDXK8xfgjDTJTD/f39ri0tDHO7GdymY2JscjY6z/dz\nGVw6wqydMSzb6zZdXFysYJhpE4a5DS2eJe/4fQjDJPVsG7Ekn3M/1mFYOrGUpcSwyWSiBw8e9DAs\np4Gvk7Em7tEh5rRhOnQeMzuWGQyQyEuv8bLc8nfKAs8ZvPWOFZ0ORhs0CL6vlNLbPptlWEBo2B0Z\n+TcqXhocgt8QA+nB2onwtBAFyALNTIvJWbTZbKbT09OunYwMGfGzrefn5x0wszyCs++3kI3Hy92T\nTO0ywuJODKn/egNGQx6DBCR7/o56vXaJ06HmCRd+SurtOjQv3C7znERQdrTliDD5kBGf5SnrSCKI\nG6QsD5nFqnX5YmlnzSgruTje/LVR4tTZCy+8oP39/a6PTtfTkXPZ7JcpAxSOk9tvOTX4HB0d9dL5\nfH4TCBrobLDSYfYaoVKWGZHMQLzRKTEsdUfqrx19FAzzuhtiGJ8dCkJdZisQTQxjEOjn0+mjI2OH\nooVhLeeGGJbn+6WDmRhmzMyMDTGMWEtHgPXbkcllD8Sw+Xze2yF5XQyjvrl//j+XgZhX1sN8lVAG\n5C2nivhOXvperoHlrk4655zmTAxzHZswzMGV6yWG0T4Sw+hks1z+xrr8SQwzpsxmM7366qsbMayF\nZwxm9vb2ujVhXGd3cXHRrXvk0pshuhWOldTfhULFtxCbaNAIWl4bQ8BKoKm16vj4uPM8mebmfVJ/\nHj0dq8w8eaANhoyi6E2TLi8Xb8zm9BqF3dMK5IGVjvxKJyHrMq8cGU2nU+3v73fCQQDOVLWFmzwx\nUPO4CwIm20rDbkFl9JRTlJnNckTXigzMZ2ZW3H7X7+fd1pyCYkTYiuQlddN9XjxMZ4wRoMvxLkEf\nvUGlpfzY0WD9h4eH3bg6Le9M3v7+fne/Fd27jHzN9bhNdGBoSGqtOjo66u028j15VALHnREc5Y/8\n8/jaCNKRYNuexYwVdcFjl7jGP/OVGGZgT75KwxjGe+goEEOHHC8/w7qJYcyctQLMk5OTFaPOjAIN\nm9tCHUrZYtks03zya3ds5Nw+9pc42cIw94W7BFsYxpmIIQxj/cl7YliLjMt0qojBdNAcqD0JDKOj\nSvlx32ezWee8e5o4ZcYYlg68s33EMAedLQzzmXfsi8eEdfk6NygcHR11GVLKyiYMc7+vg2HUV2be\n6B+06LEcq1LKr0o6knQpaVZr/adKKc9L+gFJnybpVyW9p9b68Q3lrER4dCjSc+U97vxkMumMleeH\nPTjT6bSLPFwWozNnDFIgGcnQWcjfpOUBcFx8aAWxgaPS11q7nWSMkiwANHhWUjsSVAq3hcCQZ0zl\nfV4PZCXwPcy+MErJBa5UYEdBvNdjJPUXOjP6Jli6L0yJE2S4U2U0GnVgZF74XkZ/VlruFqWRcx2m\nBCj/OTXOzNNkMumOHHDbWb95dXh42EXnlrNWBonz+XaIXKenk2mIrRf379+XpG4KmZE8QdP1HR0d\n9XYEMeojpZGjLrmNLUNIuaO8uD6X1XoH2utFTxrDmD0gALcwTOovfp5MJrpz544kdVNakjodSAyz\njEtqYhjlmBlKtoP3OpttfOK0EB0J6iUxLPWRGMRPYpjLvi6Gmafmhdcqms8un5kFZpf8x7U4DEo8\nhmzzOgxjADwajbrlDm77Ogwzf7lr0Q6KscufpsfBMDoVxjDbSs5geDzG43H34mFjWGtX5SYMyw1M\nxDCvYTs7O1txDmnjXOfR0VFnK80Hyz2fp2NLX8GUDhWdyutgWG4oSHoSGat/ptb6Cv7/Zkk/WWv9\n9lLKN1/9/03XKYjgzWs07Hmv1J8jpQG8vLzsFlG6XAKTlSrf9efvrCuBiG1gxGNFy5PeLbjMsPDd\nalJfkckHDjqBi/1nVDl0bonLch/Pz887MCU/CFKZhpaWZ+r4Gf/GNjFiZF8o7Jw6tQBnWWy7+cz1\nGwRfC/zx8XEP3LNt5FteZ3bB7TLP3Wa3yZkFOoiUE/fTu7oywnHKmcDgqTLyI/nPex0JGrxbEbR3\nHHH6uJUNTsp1ERzHbBcdyuQJ+e//b9lU4FPFMPOohWGWSRs/R/4tDONY5Lv+aBB8Xeofj+H/+bvb\nRAyjkbPcEV+MYRmYuW38e1wMy2mY6XTa7X6jzFnfvLYvjSAxjOPVwoybYpifY3BJWWCm6iYYlmW5\nLUPZvcQwjomf4eG1rUDL/PaLuxMProNhlAO2k/cOYRh5wp3f1DM6Y77m353USNvfSpT4uU0Ydh3s\nei2mAr9K0hdffX+/pL+lDaDkxlOImKnKKD8ZOZlMuuyAnzk9Pe0xmFFEy7ly2tJOmZU3wSmjT5bL\nwXS2wfd6zprboKXllBYjHEZd0nJAOa2VlA6Co0uer+T2cnrt5ORE9+/f7+0Kms8X009eLOrfKFiO\nRNwHgyn7QPDxd/KfYESAZxkeOxMXlRMsfI5LtqEV0aXzw2vM+vh3yyazqt4+7oP5uLXZoO5o2obC\nmUJHeAkOfs7ZCgONv7Nd1Bnv/Ll3755OTk66MqfTaRcJetyyvzTSQ5Ed1w5x7DLiIyBlZE8DwvV5\nt5QeG8MyUBgKDBPDTLPZrBu7FoYRHyUNYlgaOGlpGJiN4vi6PbXWnlPi3WotDOP4GkO4lMFlXBfD\nrCfEMOqo5Woymej4+Fj379/vrbnZhGHuH9cj5mdimNv1uBjGBdUMrM/Ozrrp+Xye5VC22Kd02FsY\nZsyez+drMcw8MoZZph4Vw7jkJjHMde3u7urevXvdOYQtDKPctxwql5VEbDIx4ZHjugnDXuvF61XS\nT5RSqqTvrLW+T9KLtdaXr37/sKQXr1MQp1Ss8O6wHRUPFBkymUz0lre8pVsgx0WRFkCfOcRIIqNF\nX2eEROeEnr/vt9LaGBnw6HgYSBg1ZDRLxfXgua8tJ4D/0/OnwtExMzBZgbndupSi4+Nj7ezs6O7d\nu1197peVQlLvk+lcKhfBmZFqLrDkNIDHl+NhoOLUg0Hb06y+7iku1pVKZGK0S8eADiDvZXtz8Sad\nu/l8rje/+c1dBEhANE88defxSbCkEaIjRUWmA+9Pyw53dT58+HBlSz/HjqDGgCHBgmBDIMuI3/Jm\n/tkBpnwwSkxZfh3pdcewnZ0dPffcc5rP5906SL7hgRhmvrUidRMxzGPgbJinxaTlFI7H2O0hnhnD\n3B/qXRq7HFfKGtvdHITa34HnKTK32VPi6zBsd3dXd+7c6WGYjXxiWDqplF3iLjGMuucy2L7UFQYq\nHhPrPqf4WhjWCgxTztw+Olu50zHbm8mC62AYcf1RMcw2jQ6MZc5j7YCVm7pyA4DlNuVoHYYN6Yyz\nZabrYBjLXIdhj+tY/Z5a64dKKS9I+kAp5f+OyusVYK1QKeW9kt4rSc8991zPUUohpjA42j08PNTO\nzk638+DBgwcru/JchsEhvXsqvK9dtbvnrEhLoXRbCEL0lA0u4/G4yx6YMr1tovNm54GDbDBkVOzP\nVtstuJxiNLBagTyPTyfp7Oys293he+2UeeFenkdigPU1t9VCzHlptzsNtcfN7SdwcF0ZeeColdGM\n+0rAZ6aAIMln1gGZ2+E2Uhb5Jnunqy8uLnT37t1epEzQMe9bUyX+322nnPpZRk5cO2Hjbf7dvXtX\nh4eHeuWVV3oOFvnXMswJTG4HHQXLct5nvfCCVJZFfvPE/1tATx3DLBN37tzpsgKz2UxHR0edE0Cj\nQ6yR+pmmaOvKWBLDLL+UWQZnvsfyRQzjuF/1vXf0QAvD6EQbF9iHISxLx9TfnVlhJikxbDwer2CY\n8T/PxbI+8dnEhbQZHAfy++Liosvu+F7aITu6XMM0mUy6Ka7MrNNheRwMc78krezITTwfwrBsg2V4\nE4YxMKA8b8Iwv77s3r17Ojg4aGKYyzOtwzBTOsyJYeSLg9R8xryl/W7RYzlWtdYPXX1+tJTyw5K+\nUNJHSilvq7W+XEp5m6SPDjz7Pknvk6RP+ZRPqVI/Lc4Dykzj8WJrup0E7zI4Pj7uBIgGSNKKUrQG\ngJ8tY8DIz4NfSuktjCY4UBmzDXZUqMQpYHYYgl+9gaXi0ZlIR9HP+IwVRjfuG6MGTx+Y3wTFPKYi\nownyPXmc0Qx/Z3szu0ElJXlqNXcNUvGS/6zfgM7+tNreah/XVNBZNHlXTZ4KzbGjs98CAcolecHs\nJ/veAtvz83O99a1v1SuvvNJlQDJiZV2SVuTSxOuZjk9nwvdwYwOza7fIqXrNMKwVeEkLXnj3sjFs\nNBrp5OSk42PKExdes8wcgwwUr9rYlUEMswxzE891MYxZHzp+xDDvdMu2cOqrlY3xfSmjlnfuNCXu\nrMMwt9sYxjpaa0Gd5WLfiZtDPKbTZf60MMx1G8NauMn+cSw49i275WdYd7aX408My8zX/v5+NxWc\na7vosA5hGB13aZlZzxkc8pFt9SyUMYw70V8LDDOlz+Bxpd3fhGGP7FiVUu5IGtVaj66+v1vSt0r6\nUUlfI+nbrz5/ZFNZo9GoSz8660OhcJRl79nrVy4vF0cWuKMGB6axreh2aIaUgKBFgWZEU2vtFvFZ\nGXIai/PK0vKsEg6iPWLuDHEZbq8PUzQQWci44NFRHNufDgznts/Pz7sF17zP4OhUNCM788qGs7U+\ngmDpPnC6yUqUCpjPcN6aPGG0Sz4YUD3+3A1K3rkPafR8D1PIXIRJI5RrCtxvRqW+z23xK0mGDqlz\nypttS9mzDJkfOf68lzuVLHMXFxd68cUXO/nnexQ5XZTtaxm3jBCpq5weMuDasWRWgtdeb3rSGMbT\n9IkZBGY7lsSw4+PjFQyzDBoHiGFXbe99+nsa2MQwL/amTubUijGMhjAxjEEbMYwBVwvDvNONxqt1\nqCYdA85CbMIwZ7CNJYlh1CHyz/0wsb+5Jm0Iw+ig+Dc6tMzSeTkD9WwIw4i5nC5l0EYHkuvqboJh\nnKK20+2pVR6cSeLLm9cFuJaB5H/eTwwzDWGY+ZXyabouhhEDPUbWVeqfcdXOZsuZND1OxupFST98\nVfhE0vfWWv9aKeVnJP1gKeXrJP2apPdsKojCwFQpU5ScKvJOBK9FyOiQHaYApiC7PGa5ErAYrTiT\nZobTgfFg8NUt3MHAxdUu10JuwHGqls+ZDxQgrm+g0XYbc1cZFYlrY1KB/bsXNJJXBhULl++nkzIa\nLd8vxyiM05qtiMFkxRvKbDkq5itsEvx4MCenDOhgEpQJAAZfyoXbSoXk7zzLxuVxnDzV4/dypUNE\n4+O62E5PC7ciT9/f4qGNKadB9vf39Za3vEXz+bxbk2Kj5EWzabAIvATrnZ2d3is+WkEJx4dRr52E\nW0BPHMOkvrGis+RpKmPYaDRawbCMnqX+qe0tjLsJhtk4GQcya2sMk/ovMB7CMDuUxjDLvDOkLQzj\ndKN1OjEsM+vUX2aeNmEYKad16KSQ6AwmD4kpLX0khqWxTwwbWtNpDHMbiWEZKNKRc5voZFEOc1H3\ndTFsPF7sChzCMDpX0nLtsetIDHM72YcWD41hzIwawy4vFzv++W7c62KY+bG7u9tb15YYRhvF31PP\nWvTIjlWt9Vck/c7G9d+U9KU3Lc+d4I48Cwg998vLxfZZM5GLL7PjFjIPMueFTVSQFqMs0C7Xzp6F\nnxFArkOZzxeLiBmxgU+9Baqc6/Y5TNyNYFDe29vrvZSZ0ZCkTmF53oiVpgXImQa2IvjZFDZmKCj4\n/s1KweiP0S3n2RnFUdGobB5z85Tvc3LfPB4EKWbKXBazUS0Q8meOtcFnZ2enm4pIHpI/rst9ms/n\nunPnTgf0OYVK+fJfbsVOIE9Zzeyr25brcbz+6bnnntPJyUl37o4zsd4G3jJe3DmaU4u5a4qBEOX0\nNtGTxjA659a5lAMbrN3d3e6gTzpOLaPNsX4cDLM+eFz5NoHMLFuO7YQTf8GnnpEhhnn90HUwjMaz\n1to5mzxEV1q+cPm6GEaHiRhmjCKG0VC2MiuJC3yGGEYsaGWupOUZhyw3McxlMMsp9bEi69mEYd49\nTAxzm11OBs2+5+TkRHfu3OkCg5xCdZA2lJnKz5asDgVmiR/GsOeff76X7fXJAC0MM9+4k53vwG1h\nGPGK7Uib0aJbcfI6hYsZDWnZIRoIer+M8NOL5CBREHkvn6Vxz/syakiF5nVpeSoxd/uZCFoUILaX\nKcrsG6dTzIt0KM/Pz3tne3FdRIs/ec0K5ueZXZOWi08z8+R70oFhtEk+cJwJFDlF5XFnlDcej3vr\njBilUAHSYUuwZDvdJy7SnUwm3ZopjqXrSFBN0HJmgicPM63Oeu0YJw/NBxINlutl/fm/eeayfBgl\ns3vObDkTSqesNW3YAneWZWIE67F8lqiFYekArMOw1PN0sNJ48jufHcIwEtcjsU4GoXYYeA5g6q4/\nWxgmqYdh1EFpuQieOp0Ow3Q67WYnbophbn9mb4ktxLDkdToO7DNluYUzWYY/fS35Tr4mJnlcsm+U\nh00YJi0cH5+m7rb6kxg21GdiGLNaLMd2kIc3Z9aHRLnZhGEkZgPv3r3bJS8Sw3LXovszhGEcu+tg\n2Dq6FY6VtDx7whkoKwVTq173Y2WU+p1MBWQUSM8/U7QZtVAY6EX7tO0EGDtRjtI8D2zBS4eL9dHA\ncFdCRlh8fQnXtvi7IzQKjHfM2BFzmeYBM1os28ruKQpH3QQKCyfLcT211u7VGDzYkONCADA/vKDX\n4EPFc1m19k+sJyibWlFty2C5nnTezP+dnZ3utQ0eY9/nKdccU//Oukk+Idt8pCOSRqhldNNAZfk5\nxpeXl12Uaf55PZ1T644uc4cOI1tO17ieof4y0+V+uh9uX07TPAvkfnsqxPJlDLNcOSBIDKMTzUyX\nHZ4WhrWCxxaGeSysl+nYW749xXtxcdE5VTRaUhvDMoBrYRhf8cSZBuMGz6pyXZZTr8EdwjA6IMYR\nZ849C3JTDLNxznMAzQPKs3GLGNaaenRWytOl7rf7xjG5LobRJtl5o3NFDPM7HVsYRmcwF/2zHd51\nmTsDjcdsL/sx5PDn9SEMkzSIYU4mEMMoC6WUlSOXGEiw3utiWDp8pFvhWJVSeuumDDoEbkY0NsJO\n5bmjTKv7OQ4elTGNFYEt22YjwEGR+lNLtVZ97GMf60WiBKTMjFnRuXOM7SJIuQ3elmuAYj99Lz3s\nbIfLoqNKPphfVho/5+kiv9+PyujyzaODg4Pe79z1wijQbfOYcZFgRpyuw8LNzJyJoDTkANTan+83\nX/liVyqNp1MNOBwTT3PYqHiqkNFrRrYG0YODg96mA77OyIbG61xazlRGtBnl0Qh6LDy+brMdbr4b\nLtP8LodOMI2QddS/0RlmvUMLbZ8lorz4hGhG9MyaEMO4Fklarr2koUxMGnK4r4NhdN6lZSDl/z/2\nsY/1DgC9CYZZDjjWXhhvHfcaLQeKLJMLp02ZJco1nVzi4DLMTwad5uV1MOzw8LBbypDLTTgu7icx\nzGV5DLiwuoVhiVW0U7xODGOQ6bF1Jsm8tNwkhvl3aYlhLtsYlmc7uV5/zmazbs2Vy/M7+xLDhuSS\nY3wdDGPA0MIwBzBDGGZ5oeNUynJnv3lMDGMWrYVht96xSu/RCsNorAXsVGiXk8pKECG1Iv6WB82B\nbqUPx+OxTk9PdXp62nnMLTBMJ88DmOVKyxQ6HZ1SFq9G8fWHDx/2DH6LUlCZ3rRwJJ9zXDKKTKfS\nvzEyIHCwHXaeGCWkgFL4rUR00NgGy0Jm3wwG5ksaCN/Hl2qyz4y2WI5/b0Uv6YC6b3zOPPGpxJaD\n5JeBOseW4EZeuz/8zddyPYDb7QXtlgdnWlvy4ufp0NpwMZAwIBv0mPFiJL1OZt+o5P4zg8qsE42d\ntBwvj0FiWGYJqHeJQzfBMMoQZefk5KQ7Wd1Oz6NgmGXZGJb4Ygwbj8c9DKPOZdtTJhn4MTNGPSY/\nhzAs7YwXcWef2Q5iWBpp6ggdL2MYnSyOg3Wdda/DMLbNQWG2m3jCcqS+DKV+29ka2kHofhrDmPHb\nhGEtOb0uhuU1YpjHroVhDAjYBmIYM1x0uOxotjAs+Zt0KxwraSm4zCbQ03X6XOoblt3dXR0eHurk\n5KRjUA6Qy8rULKkFRDYOubaEUfnx8XF3sB/f6WWhN3Ay+8LBJYC67HxlRPJjd3dXzz//fO/IBi/W\nywFPsCLQONo0WFhBXU+2O9OjWRedwfl83i0qZJaCzhx57voMNDTYuVbB32n8szyXybl+G/oca0Zy\nNHhDGQBmSD2+BFHL6WQy6a1z87N+bx9T9FZw98d1eDqXQM2xdX84fnR+aJgyyPAmib29Pd27d08P\nHz5cWbPWqouROoGPwQ8NDQ2f/28FO88CpaNgMoYxi5kY5sXsxDDSkIzz+zoMk/rrfaQlhvmk/iEM\ny+BkCMMs59x8QePtPhjDPAVtWUzeDeF1C8PcZuL/OgyzDieGeazcpptgmLTceU0ecGkL62LbWuRn\nM1i5Doa12piZzutgGA9+9Rgaw3ykjMtpYRiPkHhcDLOM+X9i2P3793V0dNRhWMpQC8NamU86rB4D\n+hGbnCrpFjlWHoy9vb3OKNMYed0CO+WO/+Zv/maX8mRULS2Zkk5RRnotJnKaxGQjd3GxeNv8gwcP\nul0z9tKl5ZqC1o4bO5AmCj6Bl+3M9hIQPJ3F3/PN6fTiLeDz+byLTul4ZvRnUGmBqvnq+W6X47Ic\nSTB6sMJwKqGVIieQc9wJVCY6jXbKHNlyEWdLhlJxpaVjxUiSjoLLJ48y62Cnzifa7+3t9U4Qdt+9\nXZnTHHQGOYYtsElgZlhWqQAAIABJREFUyv5w7Nlnj6WB786dOzo+PpakHjhRJyzH8/lyTVxmHQlS\n7JP1mjtGnyVyH702J5czDGFYrXUjhjGLlWPLLInvJ4a1ssTj8eIsvZOTkyeCYabMEKxzpInJQxhm\nmSFRJxPDXF4Lw/J8sWyvMYyvzyllecxOZkDoLPCYHJabzugQhnGMjdvGGOMY+0+8oW6SMqgjfrnO\n62KYNxLYJpq/7rs3vLQwLE8wb7X5OhiWdoByZUfbi9ml/mHELQxz2zdhGMfTwbqnOYfo1jlWVIhM\nR2cUd3Jy0gN+CprUd05YBgWNAs8/CxDJ1/yC5+Pj4+6wstxpQ0MiLVOMjCZ4KCAVNqORTN1mX3ls\ng5Xdc810oBhNsAyDJ9c52eh74afvJ79z8Z/JBiWjjBbAtLJCGX3502DD9DOziXbkhrKEqbDuF6eU\nc3qQa6YY5bTIDihBxON/cnLSjY3fC+d3YVH53XZGsS43+WQemVqKng57Bhnmgc+kOjg46GSYafA8\noZv8oTOc/DDAGqCZaXjWiH3iQnPq8hCGSeqmkn2vy0x+pYzRuaJe2anis3b6fNJ7C8O4DotGnhjm\n+3OTCesinhJ3MwOwCcPcDztadCxc3zoMs7NkvmzCMBvPIQxjH1ym25F2gH2kvXE5nIlhMLoJw9JG\nEsNyepAyl46vacguSksMOz097QLiN7/5zV27ebTFOgxL2aacsH05FhkY5m/GMGPUwcFB1+abYFir\nfjrHDpY43ThEt8KxcvTD+U6mn4fIA0pw5yCkl9sCf9dP8PKBdyYPwng87l6fY2dlaB45o5vLy8tu\nB5YVseVUtAQrASvBy23gfXQenF2wUDBr5Pal4FupuUWXdSfYZzv5SQPA36wQs9lsZZcYIyLfSyVp\nleGx4lRqtpFjSWD0dxsPl+1yMmJsOe2uI3e2sh02Znfv3u34fn5+rsPDw86AceFnOtEJ9jkOLVli\nJJj9oQxOp9PeOXIkLuglH1tG0v0yGZTYznV6/UYkOwc8HPE6GOYMUU61SKs8dD2ZKeIY+LudET/D\n4Minkw9hGDHLOOD/iWEuOyN7fvo7DW9LZt3/FoZZru7cuXMtDCMvjGG53pFt5/UWhrEt6XQQf1qb\nMqgjue4wy+AU7CYM43Pkka8b94lhyQM65+Qhlx4khrmshw8f6u7dux3PN2FYBgF09q6LYRxv42zy\n2O/4y5kKqY1hKb9DtpgYlja7RbfCsZLUEyxp6cnnAjqD1dHRUc/oMALI6bSsR9IKkJnRjjTphHmL\n/NHRkWqt3TueSlkeS2AhZKSXAOEjGRhBETzpBPLZVqbHipqK5zKpGO6jX1pN4HdZFjK+x4yAQIeE\nGaPkLdfIWRhZh+fi2T4Dr79zyzMBktcMULnrkGs0uOPSfCFvPeZOWTPLwKkXjg1lh7LXmvLijhOO\nmxcKv/DCC5LUy+S4jXzdjZ1iP9+KlAnWBJqUKfetlNLt7PH6wNFocbr2nTt3ehlVrrewky5pZWz9\nndMZ+doctv1ZIxsY02Qy0dnZ2YqjalkxhjHoo5NhSsfJusLMFcc3T76W1GVuiGGWOWIYjWhimIOC\n3FlH3ZBWj2PwtZTDxDAaK2IYcUjSCoaRh3ZeaFTXYVgayMSwWuuKnLttiWHcvMAz75i5Zb3XwTAG\ndORtC8OMeczotTCMupqOFx1pTtszU5YY5mcSw9yWxDDi4U0wjNfM//39/W4a8uzsrGvb3bt3O+zy\nmFI3PD4MKLjRx7jlLBWzkNfBrlvjWJkBZLQZJi3P3bBy+5qj7wSnFDwqKJWDUZ3UT81a8DxoLsPr\nl/jOOjoRjHwIGFYug6OzQRZMDz7XG6URbxmmBGNu184Ii4sVeXq27/ViaT7rdnuhIl8jQL6xPSYq\nDf/cFipJZvC4HiXXAvD9ZNz2b95klMfrBHe33bLDw1cpj2xLGgw7ilZCRkXkEx2z0WikD3/4w5pM\nJnrb297WvQPN4EpHdFPGNYmy74W0HoP5fN4FCl4jaIfbU1EnJye6d++exuNx9zJwOuf8TiOQmVMe\nMup+p749S8SjE9zPg4OD3ro66x6dKhpqaTXYIm4xcqdcu3z/bz32c7PZrIdhdvyJYZZVYweDNuLI\ndDrtHEZmtG1ciWFuewYGXCdlIt84PeO2cMqMZ19J/c0m5Ik/rQveMOL1XLm9vmXkE8P4e2IYp+To\nTG3CMAZhOZZswyYMaz2Tzm0mFBLDvKaK/U97OYRhdhafFIZJy80AdK6coDg7O9PR0VG3zssYdnx8\nrPv373cZWspCa7eyy6b9t3zk+sTW8pekWxE2EiiokDZ0XDyZTEpHg4LA8hlVm3iPvV8uOCUImHyE\nvh0rMz6jEnr+BEOX6QP4Hjx40HtxqNtogHNdqdT8jRGt+5VRASM6kxfLZh+yXH9yisB9NaVTSR6z\nfRwnpmwJhHSmOQZ2Pg1I5uN8Pu/exJ6RYo4125BntFh56RSzDwQqAv90OtXDhw+7c8YILq1olQub\nz87O9PLLL3fl5Bjx6AZGjGk4mIlKB5ZZCBu509PTLlV/cXGhV199tbez6uzsrJe55Po2grrvsRz5\nXh/MmJGuqTVt8kYm6goDo8vLy04uPUY2Wq0xdFktDJP6xj1pPB6vLGMw7zkb4FcZeZyo/5ZL192S\n/RaGed2pM2PMYth5Y/+k5cHHDAIza0Gnx/yzcyqpc+wSw3i0gfvB/vj+xLAMRPnMJgxLx9btJoZZ\nJpil8tofYhidnuzDOgzjcpp8lv+7babz83MdHx9354wZwzj+5ldi2Pn5eYdhPFvStAnDaNeGMMz9\nMQ8cKNh2tjDs9PS0Zw+GdtsTp7hujDuyfR91b11weGsyVvTy6T3S6Urv0cQsQnr06SFTcRghetGj\ntDToe3t73YI9R/IWsBwgGhxGF2Y+M1t+xr95jVErqjFZ+VwmU91UOIJWOp3Js1qX0wppMN3G5DHb\nzd9a49kiG2COre/3M7lDo1UuoyLunMusVYJLlk2e5f8EN/9PmSFQsgxOUzCbRt5ZjqzMr776qt70\npjf1+Ox6aEiYASJPXebQWFA203D4/7OzMx0eHvaMD7dQs998ntPn3E3l8fX9BK+WTD4LRD57CpDj\n4l2rUn9chjCMZfq7n6X+SsvAwP87M3N8fNwZDx/kyMyiyyMGsC10rluOln/zuFrH0jlkUGy99b2Z\nYZf6GEZKOXeWgXr2pDAs8cHtZwKghWHcVdwq13Vab7wmLrOXQxiWbU+708Ia38tdn5swjPYhccbl\n+h5iGPu5CcPsQLkPQ2NBzEjZ9acxjA4gp0dZP9vBXZ0tDKMNyB2gLboVjhU9U3eCoOKOOKJnyjcj\nxKFySUOKYsE2IDrK8oB5bVVrWy1BxNMsBKFMpZq8bsWA5yyAIxcqBevgNUcYGeGl8WtFwKPRqKfU\nroMnE7ss/5bGguDDlG/ymm1jf3IRe0YtLtdj5O3P4/G4O9zSZVnRKUv+zvbRcafs5Y4PKxbByE4y\nI17+bhAxiO3u7vZeHk2AsKN5dHSkk5MTfeqnfurKNIjbxU0a5Hs68inzHls6QP6joXEmxe809ELQ\n8XjcmxqgoySpC0r81gQaAvOAfM51I88aEcMsF7u7u91aNssfg6zEsFZkPBRsuA46VcYwO8e11u4Q\nY58MbyKG2aB4miUdKdfDvrrdxjxjGE/x5nS4n3eWy787uCROEE9onOm4OVPn/rs91HliGG3HJgxL\nW5HBagvDjKctDLN+GMO8Vo1H0jjwTDmhzg5hWDqpDKBzNiSzdo+KYebR0dGRTk9P9c53vnMFw9yu\nTRhGZ57kdtqO8Xnyx5nCdRjGqW7qJ2ehMkvZsqfr6FYgXHrXZKqV1IDkaxnhcLosQYBAl4a21tqB\nnqTOWHOudTqd9oyGy6ORkZbRaGamqLBsc3roLs9Gik5WRmB+1sDGYx4MqhbmlkNnpcw1An6GjhXf\nOUjFGIow3K48SiCjDvPCdfG0ZpbF51k/+518dT8SXDKTlzLlawYij6+zlQS+1jSC5YA88Zg4o8B3\nj7HuWqtefvllvf3tb+85wrUuF8O2nDI7/y3dIeV4+B4+62mb5557rpfJ5CGT7j/7bMes1rqyxo8R\na+rfs0StiN5yZ0clDSXHrIUPvk5coy75O89Io65a1oxhnGY3TnGcOcXDNhFT2ebMPnqMXZ/xlGvz\nkj/rMIx6Sdmh0ed14wIxrNblWW3EMPLySWBYKaVbpD3kyCWGpSNE3uRv7mNmUzIpQT5YT41htFs3\nxTDzLzGMTtPFxYU+/OEPPzKGJWV2jrxl/Ylhs9lMzz33XM9m8wglB6qc/vWzxivaCuMag5ChQEe6\nJY4VgYWC62jLGSBO76QQEmR4neWmQrtuOkc09H7WgETDwrVUjuyYbkxlYlsy48b/6fw5qvDg28Gi\nkeNBqiY7eH6GPM5IIQ2x+85I1+PBLB69foMF++L5bAKTnT2WawAgr1rpboIvDXtGc6bkL/maCkzH\n27LgzJTLNm98LXeO8ntrnFkvnVZOB47Hi0MbP/KRj+htb3tb979Bi7KestNScoIseWjK6Jt0enra\nZQFsqOmg0lmS+kBMQGKQ0YoynxXKYIkYZgfAZ1ZR3hLDpPY0euIIMxeWH1+X1BubWmsTw4iLPseM\nWa9WvZJWDA51ms9J6ozwEIYZI66LYZSh1pRXC8Msq3Y0eJq620gMcz03xTBjlx3BzLxYb4hhmTFi\nX8hPZt9yXHL5CPlKuaCjRdm8LobREeFp7eaDnRVj2Isvvthz7OgErcMwfs9AmzxaF0TakTw4OOja\nzwONW3aGvOJULzEs6xiiW+FYuYHJYC4qS+PRijBa9/leggx/54tQOfieXrJQ8HkaYQIS25IOYAoO\nlSnLpwC6/W4Hz+5gGt5EB1NSLxVKJWD6mnW7DCuZo8YU6OS328AFzDlONARW2nQyMyrNMWbm0XVb\nOXw9U9A5DlZWKo2BlG9HJwD4Ny5GZfsITpkubzn7jLqy/5eXl91ZVwk8jhhzHJLXHEffk/rFceB4\nuL9Op/s5R3HMLFg2DUSc6kjD4OtM5T8rRN1h/7hjeQib+NkqN2WNuCAtMcy/WR88TnYQpNXz9Rw4\nWg9SJtP5SJlhn1u8GMIwt/MmGEZj7uCOywpIiWEegwy+WhjG4CrHjGNrPrQos4yur4VhdMB49lk6\n0SyHfefhqnZkGfimk+/6NmFY8opYlOOe5VxeLk7tv3v3bm9JjTGslaXz/+uw4Tq2nRh2cHDQwzA6\nt2y3A2ljWMqTy2hNZ7boVjhWJGY+rHjZCTKfxo+/r/MmqVA0eo6kPBdrY0pGW+i9VoECYkVkJOj7\n7blz2kfqv/+OykHl9RSCjZrn5skn94eCTkVzmTyLyELSSuV7Xt3PMEuVGT6PG9uQYMQIjs4jFZ2g\nzyiW699ynJNfHFdpaVzcDqm/NbvW2tuZxGkHTqWMRqPO2XY9Ti/7/px6zOiSPCDvabzc16OjI02n\nU73wwgtdpuPycnHYIafcCBrrZJ48I0B67P1J3fI7uMyzVubJDumQHEjLIwdcRsvBeBbI/Wbw4ymt\nIQxL+c2ypNV1ipRBjrtlwa+RktS9GJ6G+joYxiCEDhT1g+Wx/f6d8k+D5GzN42CYtMwAZSaWGOYj\nTBLDkm8uL9tA3SJWEcOoh3TKpP56HpbbGusMeEzrMMzl8siMDGg8hs4qsd5SSg/DqJ+bMMw85vld\nHGfveG9hWNoQ2nMSx2QoKGkFjL52fn6u/f39nlPFZ4cwLB1GH+WQa5WH6NY4VlZYLtorpX9QIg1x\ny5j6uymV3fVkdGAvOh2yFOjLy8tuAaiFkAqTkSAzPtw1RUGhEkrt9CINEuv1ug3zyYs4a10sVKXw\ncuqMOyBTYOnx2wEz35n14tosUo4Px9LjYCXnAZ65loCOpdvPRdNZvnljEHGKnYtxPa3sl83SsWCG\nzbzOqd10CpxZMnnKjFueEzzINwIRQZIRlQ9k5BSO19NkpNai5Cd5xuvUL183KKVTReNk2aYMZ3k+\nW4YG7zpO4BuNhjDM625aGCb114n4f1NrXHkvM4MZMEjqZRfdhiEMM1m3LP+csroOhrV2THE9D4NO\nLiq2gferbOz0DWEYM8LEF8r35WV/UfxNMcxlrsMwjn9rzJiZYuaETir1kAdOr8MwjyEzNFl/y6FO\nOaNT4cX0iWEcb/LNDjrXJbuedRi2v7/fHZVAvid5rVxLJxLT+N38Tgxzm3k4bi4rIe+k/hIYXx/K\nVJpuzQpSGzROK/j6kPHPAZdWF1m2IiB/ZxktoKAgjkajbjdNGsv06tkGLgz1M3yWbR36TiBguRZw\nCwoXz9vAt5zLWlen6igoBBE6cwYEKxHBymOSAseyTGxXKaUX4dswkY+ZTbFgtxxr84JTrXR2jo+P\ndXJy0mX/CNqmjFY4DjkmBJ7ZbHk+VMt5YBl00hiFkuez2aw7dC/bknxOsGRk3WpD6gSNR44/MwMc\nB0bKdJx8H7PPCfDPomPlsWSGwNc3YZivScNrrPiZRp66kWND3fUmnBaGcVwSw1inf8/2pnzzGoMV\nX2eWt9a6cqYWzzA00bjZAWlhzyYM899Q8Jc8TgzjuVXS0sFl2eQN22aDno4hebUOw05OTrr3jKbj\nacqxJL85hjne0+m0h2G8d2iM6YR6PdwmDLNTTcpsErOa5B3bQd3xOGXgSAzzs5ypSQwjvnLdXQuz\nh+hWZKwYSdiwSuqyL55CYzaIjhEHPSO/FFoTDR9PdbUwMNJzhEehZFtct4Wp5WylQLh9LCOBQOrv\nmsj+ZlpYUrfl2f1y9OFneY4OeT+fzzuHiX1k+t8KQgeIB0RaEcxDl2lh5zjT+HA8GSnb6WI/CViM\njLj2h/f6ZF7f7+fp7NrQ+PcEOak/ZUsZooLZSPjgusPDw5WMpes2YHj9iMvxAY/m19nZWbeQ3BGe\no6zcudOK+IZ+S2ORRt7EQIc8o3x4HOgseIyogzT669r6RiTKKo38OgyTljLUCr5MLWeH+Cepy/6a\nvy0MyzO0si3+ntNXiVc5vtLqkgY6UdZpaXURtsl6UmvtHdtgJ4VTX5khzSAtMYw2YR2GUVediam1\n9pwo3+e+MHDw78bKllzw1S6JYdkvYtjDhw97uk99kvoHhTLwofPKcTWx7WzTo2CYNws44+j22VlL\nDPMxExzHFi609KLl7LaSF+YNMYxObgvDyMd03hjErKONGatSyneVUj5aSvmHuPZ8KeUDpZRfuvp8\n7up6KaV8Rynlg6WUnyulfP6m8k32Iumt1lp75zuxwwSVFoPZ+VZEaO/fnjSnZggcJycnvflrX/dA\n2AkgALXm8VttZfoxlYB8cV1UQn/nVJaB0/2wQnquu5TFi0wZ0Ro8zFcvdGfUJfXXTbidPNcrnVev\n0fKYus2czmPmand3t/ciZv/uT5/rZZDiu5zoFLn9s9lMH//4x7uzchiF0KhwcwJP6S1l+b6oHE+O\nc37n7ycnJzo+Pu4OaKR8sVxmRy8vl++xcj999Mbh4WGvPr5TsUWM3IacGYJwAoadaq/xo/wyrU/H\nNg2qAZm70K4T8T1JeloYllG4MYyOgtQ3fq2gCm1c4TspMYwODXHFGJbBAfU5Ha3MKvr3lKPEMNff\nyqgmfhALXJb/7BxOp1MdHx93GDYajVYwzNP6xDA6TqYhDOMaS+qTnYTEMAaCLN9H43jsXYYxzMdO\nDGGYbWALwzhDIWkFP/w8d7Qbw9JZ5tjSduWftMCwo6MjPXz4cCOGecwygPXSi8Sw2WzWy3AljmWm\nlLLCPmZ2PjHN45zPcndkC8Oop5TLIbwlXWcq8LslfXlc+2ZJP1lrfZekn7z6X5K+QtK7rv7eK+m/\nvUb5HdEAeh7Znck3VWfEts7bTeDwNa7xSc+0lKKHDx+upFstmL4v29TqjykBL42YI5SMetNpYd2M\neOmcpRE7OzvTgwcP9PGPf7wTfCsKpwccYVFQvYDZhoLRkcHB7Se4ZiaJ4GEeG4yYSjcw+ne/GHpn\nZ6d7cTCF389J6pxJR+iMWNNBzTUMHgc7FOR3qxz3ieBE4+T/Z7PFAaD5OqaUKfPJUakzWWdnZysB\nRlLKHtvEbEAr4PB3l02gsgHw+LusjBgtN3SYPUbXifBeY/puPUUMk7SCYZJ6gYPvzXHJKW5/Ur58\n3RjWKs/lHB8f9zAs5TcdOspY4g6x1M9swrBWH4jzxiLiBrGDdU2nUz148ECf+MQnehgmqXOO3CZn\npfx8brUnJjkoZcbd+MBX8iSfWxhGPlgPdnd3VzCM7yQdwrCzs7PeNJXvpVPqdjJb77bl7rZ1GMa2\nJIZJC0zahGHpaHHjxnQ67c4CHMIwlpfEGZtWosT/U3apJ86MWT5vimGtPq+jjY5VrfV/lfRbcfmr\nJL3/6vv7Jf2LuP6X6oJ+WtKbSylv29gKNNrCZ6HgHKe0uoMgvdUWtZ7N67w2ny9PQk/hk1ZT5P5O\n48zBNjETxOiF/3P6zgrLd0jRuJE3rX6RR/4uqXszudtqrz6jMdeRUU0LDJLfXJBNRbXwu2zyzM+0\nsigZ3ZsXnCe3kzcUbfN7Rt9ptPI3tz/5SwXlmPDPzzpyyvZlHe6rHVb3iQsoOUXbcloIXjT25G3+\n3romLUGSdbX4x+spJ5YJjvfToqeFYcxSEMNaBiFlKNq78n2dM5zjYL3zWsLEsByblNVWO1JPWxjm\nqS4uPzBu2bGwA8LnEzv56bYTU6U2hmUGznxm8Ol+JYa1Mh6tNUtcuN3CMF5LI886mJly3xLDWlld\nXjNGtDCM/Er8a8kfMczP5t8mDGO76ITn9Cr56ilyti0p5XAIw1rX6BjmuFwXw/jbEN4mPeoaqxdr\nrS9fff+wpBevvr9D0q/jvt+4uvay1pA9RaZIKSA5PUYDSKJitO6hIuWpsKzrwYMHXRSTQuXoIdvU\n6hOnliT1Iir/z0F2e+z50+mh8HuaTVoCTqYyyScKm+vgy4t5GjGnoizAFxcX3XQDBTidH64joVCa\n0sEzuKRwuw/cueH7PTfvNjvN7IwPI2XKg591OQRJ3zsajXo7clKmUs64Foxj0XrGdHl52e2SOTg4\n6Dk7bBf5NRqNujcPeEenebu3t9cZmJYMZlvoaDNlv87wO2PJcg2WvMbpBtedBttych1weo3piWNY\na40hcYUOFHnEsWkBfes7d275Gp2IBw8edBkXYhidPcp/4oT12DhDnU48YRnO7GS7XBeDwiEMSyeI\nU0LEFGIY12AZwxgMGDeoD0MYNhR45Dh5HFoYxraTL24PMcxLKnJ8MphkoEodttNAJ4ZO1pBMSerN\nVLh9rT6TF8YwB/3XxTC/oJknoEvrMYz1EtdbeJYYRucys8VuU2JYJgFazi2xbogee/F6rbWWUm68\nxaeU8l4tUu1661vf2lu4Z4akAfR5GRawRpm97+lgXLVX+/v7PQVituTll19eWVeTWRAK7GQy6RTc\nYJHZn1ZbXS8HMIXYz3G+mn1je6TlVtmcevMzLeVxCp3RJ737Wmu3VorTsvP5cmE62+C6qPgZublN\nueNH6is6Nxi0prLcFu7W9P2MhFI2UgH92ZpDT4Bp7ajieFFuc0wp35eXi6M7JpOJDg8POxkkzyz3\nLnc6na5MibfWIaQeEIw4Fq2sEeXVGQhpeWBogjUBJqd26Mi26rkt9KQwjNPK6Wx7DBPDWs4vyl8J\n/vx9b2+vK8dOmzHspZdeWpmCzyw76+YmDE7l2dD7fpflttExYZkkYhhlOoMQYgIPPGUZlNcWhl1e\nXuru3btdEMWgwcsLjPt2gDnlw75RlhlEM8Pk9tKxlNRzjqwLzPw7SGbb+P7GxLDWOFFeiI1cTmBK\nvLoOhlFuiSHp2Jonh4eHHV99H3lnefJC95aMbNKF1m/Es1aZxjAHzfv7+ysHgpNX9AnoQHN2KG1E\nix7VsfpIKeVttdaXyyJN/tGr6x+S9E7c98lX11ao1vo+Se+TpM/4jM+oHEALP6MMG9r0sGlsqaTs\nuAUyDQvBYjQa6ROf+ERv/prgNJSW9aAZhDhoredcL5UhjaF/4zw6hZEAkxEWPfgUWJdDBXFb5vPF\n1MHdu3d7IMIxcBo/09GuIx06lk0yGHHxNdPaXIPFFLIjcPPAymtlYbbKZdM5o5JYvgiivIeH2KVh\n4thQzoaiwtY9lseLiwsdHR3pLW95S29sM+vjvs1ms87B8Z9fkEo5ahmj1BXePwRQfu7s7Ex37tzp\njZGfs564bOqy22KD5Kj1aU4FDtATxzA7ODQANvAePx6m2NJ9lN2TG8roo2CYvxMr/NxNMIxYQueg\n5dBL6mEYA7GcDqLuZEamFZCxbYlhd+7c6Z5vYRgxwWUYNzK4ysyE22k89roqt4P64bZ74TOzUiwv\nMcz9zXfrGZesT+swzLxmgiDxeR2GUT6o07yHuGgMIzYwk8Zxms1mOjg46LB8Pp/3Dj5Op72lJ2zD\nOuziGE+n0y6IZTvdv5RD1kUZyexzix4V3X5U0tdcff8aST+C6/9GWdAXSXq1LtPta4kg7MFmhOG/\nnPc2tTzIFpO4wNrkCMkD2yq7FS1ZSa1Q2ZbWc1RYRi/sY8tbT1ClwaWhYls4p8xyDfCMvvwMDZ+v\ncZqR2Tv3hf0iDzLCYvSV03XpCOd3TiEkr3KNmheusu/+NBEo6GTSyTNf+N3j5bUjLItGJPu0Tulr\nrTo+Pu7xkxGT25NBhUE9zyvLsskrGn1/Wr5aRp5tII9yKrylHynb5PU6fjwleuIYRh0kP5lVTAyj\nHrX4z3HjuPM5G2FjmOk6GJbLAFJO1pVheW/pZBqexDAGKS1H3NfWYRjXm9JRsGNIXCKGcXyoc60Z\nAe6y829uI/U0HVaOMQ154pY/N2EYx4zjwfZQj/27+UHn2u32DAWfJ4alIzOk76bj4+MeD1vjzGyZ\n+8wZknU2cBOlg5/yZF8iMYwylfUxu9jyJ4ZoY8aqlPJ9kr5Y0ieVUn5D0n8q6dsl/WAp5esk/Zqk\n91zd/mOSfr8Lq5aSAAAgAElEQVSkD0o6kfS1G1twRbnAMD1wKp87mJFHGg1+52AmkE0mk24HIAVT\n6htbqQ9qXAslLddMZaRpB7FlVHK6p+VouT6nhjmNwDNSLMwESTtRNLDkVxp/n5JNo03FJj/dXk4b\n0oiko0AhZUSXGS0DmjNVrMPKWMpirn53d7eL9PL1Q1TWVrrZEVxOtXp6lxnLXDPicWYmMfuS65do\nrJhaNq9PTk60v7+vw8PDnpzQWea6LpfnV88wMMhxpnFmH9h210U54Rh655T7xt8MylkPHX/qx3XA\n6UnR08QwGyZTfk8MawUlvt6aZnU9+UxiWCurbIyxIU8MK6WsZB6JKzx2poVhXEOahtLXjWHM4vlU\n7sQwt2UdhqVD08KwzPZvwjD2kWUzGPU4XAfDuATAjqyv7e3tdWtYWxhGW7AJw9x246wdKmIH5dD9\n4HToTTCMstvCMI6Tx9OOFMvzTFSexj6EYRzrloOXTqGfJ4ZZRnk/py4Tw9LubqKNjlWt9asHfvrS\nxr1V0r+7sdYgK2UKTmtxZWZs/J0D7cGik2RFSwdtZ2dHx8fHva2tacSk5Y6+ofSpgZCRkIU0lc5t\nZdYKPOyVwXLcP57/wbS5/2dZPPy01d5W3dJCYQng6XwQOEkWvgT+jJbToGSm0ve5Dj9DwXdbrCyZ\nKaKDmVFcCwhrXabaDUg0lK6fUR4zb9xunY50GiO2R1oaJ28L9lk9vsdl2OEzELccWvKUY9gySC0n\nKvni392nvb29bus0+8gpADpUNOA08k+LnhaG8WXH5JnUzzSnYed3/pa6ZAcg5ZEYlnym/HJxPdcw\nsb1sCx2mnBJLDEscWIdhrp/LEoYwTNKNMIzP24m7DoalbpgPzP5nFiqDhHUYxszX42AYA+0hHbIT\nmufHuT0tDOOz5OM6DPM91Hs6tn4BsvtDDJvNZr1F7EMYxrYmXjFb+CgYxlkA13sdDLtOYHgrTl6X\nhg1NdoLfM1NkoiE1Q60YTAP7GZ9TwrqoUKYU+mxXTn21mG9nzmUPLTKk8nNO3gNsgZ7P572sEtvv\n6CB5w7llC52ntqyQjs64s8afBBBHO/TkXYedM0YmjDJaysp+MFLg2gf/xrF1NOhDBDlWdLIzsvY9\nzPRZ4fLdW+nY+7M1zjwPh2NHPtpQMoBwG05PT3uZqzRyjP7I3zSAbD/bkMaOY8e+kcduW0aevNdt\nJOiNRiOdnp726niWyTzhyfitTI/UPomcuMf7iWFpwJmdoFOVUX1LJvmdGJYZgmwzgwqWnxmWxDC3\nbQjD3JabYpin0SR1Msoz8dZhmOskdrSmgKi7+Vvyh2PEMV2HYZPJpDvM8iYYxrasw7BMQLCdOcbE\nRP7O/uemBPPWsn9wcNA9wzF3+9KZ5OarJPaB2ULaTf8R5zLjZP5Yhrj2LG0RMcw7F6l3Q/S6ryCV\n+gJrooFYF+mTErQSlAhWdMroNec9mQGQlgxvGVnWy6iCi309uBcXF90rS05PT7vvmT2zUBhQSim9\nt9ITJHKqJqOpjODYDwou//wMFTsBm+MzBLapnHymVRbbM2SQqAxZRzrJCa5sH6Nc8irblWPOtmZ9\nBsp0ID2u5H/yw85VyxlhNMX6cz2Iy0pninKRkXPLwDM7Yd5YLnOdmdQ/r62U/oLgTYD0RiXqnimn\nXpL3LRlqBYWmnAKkI5uLrllnGnWpbzTYlqG6XT/Jjhxxy68vWYdhloEhDOMUVeLIOgxzX90PZ56Z\nuR3CsCEn0mUN2ZuWQ7Xpvtb9bneWwQDI95GXplaWkg4F62k5xP6NZbg9nP5MG5FONts9m816GEay\n3U18SxlzWcnnbDvHtpUAaWGY5SLfuOF2EMOYqboOht2KjFVGdQR5esF5XH/LQJh50ipI0GhYYI6P\njzsAkJYCxd07ObAt58HfmUUwqEjqMmLZRwp+qz5OB1C4PRW4t7en09PT7l6/yZ1rKAg2/J/ZKPYr\nnTJOWWZEQN5b2aiULTBLB8AZqXR2UoFSQVtO45DSmY+j0aiLppIvnKbgGLWcG8omr7k/5vN4PO7O\ngcq30fP+NKgEpoODgx7AMhhg9NkCME6/kFp94v/p8LWcAkd6pZTe+w5TzsnHlpP8LBD51sIwX+eu\n2nR4aFzpaGT5JmMYX7sltTEsn20FOya3sdbl1LO/59img8IZgSEM8zM2aMYw8ydPSb8uhq0zvsze\npQNrorxy7RJ1jTwircOwxJGsM+1By7bYcTfPuRbO9/oA4Vprt95yHYa1HH46D8Qw99droDLAHGq3\nkwf7+/u963Ss1gUTHrt8SwrHo2Un2N/sM/943pyPSjJOUY4ZnA854KRb4ViZGIFl+jQja6nvyabT\nROAw6LMcKwwzM1J/cToH2+3J7JbUX39lgOBBk/Tus/0U3lwD4OfScRmNFgdGOlIspWh/f1+lLDJZ\nnGrkmV00fBkhpXPhnSmMON0WOkxeeJpTqQRaCj4dCwp9OhvmNQ0xy8hnMzLzuLsMp8Qnk+VLQqlY\n0jLqo9FIvrBu8oI8JfDQKbWDNZ1OO8c4QcD1Gcj80lguInWGwmOchzLmdIbbllMULQd5iFIGEwwZ\n0WX2qxVBXgec3ojUckzTaOT0P8eCxs7PWM8sm37OmEOMkVYxjPJK2WY7uLbEmSQuhCd+EsOor3Zy\nKH8tDGO/EsNqrY+MYa6PPPOaSQfmiWF+3hiRdqRFrJuL8IcwLLGB7bwOhhmDiWE8sNmZQ86GsJ2b\nMKzlaLYwzGMkLTGMcu4+e5x93efv0b7ZebUcrzvWiA5lLs3hOCZ+JcawbZ4xcH1uQ2JYOmLppA3R\nrXKspOWA5gGPUn+6IZVCWo3q0onyNSoAF5xykDPLkt6y1N8x4a3OLdDJVOyQorFcrisgEGQa2G02\nGDm6SOFOwDaxLEfAGbnQqTJfeDBejkdS1jmfL89h8bMtxaaT43JyA0GCg8vnPHoqK6coOP7kSU4d\nu3633XxrAVWWR6e61to7aNN9YgRKnkiLKHFvb2/FOLK9Lru1zirb1ApYWHZLjzKo8KflI9dhSEtA\nvK7z9iwRA0SSr5FfQ845ibxMI57raBLDSHRqU978XrzWus/EWbcjnT33YR2G0dGn3PqQTB90TCdw\nHYalo0TdZSBH52IIw4Z0mNOwLpu7y26CYUMON78zY9jSGW6ueRwMY12JYXzOjqqvG8Ncxk0xjHKT\ndQ5hWI6R/89+p/0n37kmlbKXGTiWx4RG4ugQ3QrHqqX86b1zEHkfgaLlUWZk5rK92NMCauDibplk\nnO/j4tzpdLoydcSoKNvO6I3CRKcxT5evta4ImoGHKWhHBufn5ysLN1v8y7R4RpkGOd8zGi23MKdy\ntpTJoOPn7PQx2krDa+F39EC+EBT8mVMdVCYu3vT4+aA+G5DMBKXxYB9Go1GXaWIUx757TJJSJnZ3\nd7vFm2dnZyu7cZhpms/nOj4+1r1797q6fd18TQBxOW4XP4fAj84zZYP8I2/8d3l52TukNDOz/p8O\n+rPqYBHLLDMt/vP+NMYtx5byRgyzTBuTvPg56/JzQxhmR4w64Oc4flIfw3gtg6+Ug1yUbBkjhhlL\nb4Jh/iQfiWGeWvRfYliu60kMMwa2MCz7RQPOLEyOA9eGEUM5xmmPfO3y8rJ7DU5iGDNW1LfrYFgG\nTC37N4Rh3glI/g9hmOWZdTJr5fa6zqQW7iaGpaNoYh20QfP54qBlnwOXssvMZPorLboVjpXUT596\nIKTVKCKNGO/nQLYiLUZKzlrYOPEU2ARCfs9MBw27y+P9XJyZ7Xb7rGiMPHz0P6MuOj4u184PI7H5\nfN475ffg4EB7e3u9VCxfS2OhNiAwMnEfcoGflZOL5dm/BCxHUC67la72WDLtT1ngWLgMj4ENw8XF\nhU5OTnr3M8Nkp2oosiSl0fAfDZPXtNEZSZnxtRaPGL0mYDDjeXm5eLv8888/31t74qjZL/01/9IA\n0RAmYCYItQw7AdI8d5/MD05buB3kI/syNM3yRiXqpLR67EgaLn7698Qw37MOw+wIcUqY+sK6Ej+I\nYf6tZcg2YZjb86gYVmt9JAzz1J5lkLiR06GPgmHuE3WHi53JK/KCdaQ94LgwmHMQ6O8tDPP6XTtV\nLQzLsU8M41i0MEzq62sLw9jHfCVQ2muXaYxIDDs/P++WsRjDxuNx76BbLo0YClx5PZ1Yf+dYUP4s\nP3auONtBRywD/HV0KxwrG9BU6nUOjrS6M4yDKy0X1Wba3c/w1Q18hkadQOY1VBZSRn0WMp9DxEFo\npdbTkPO0YEaJQwpLAWaE4sjKYGmwqXWRviUwuJ++lgbUYETnjw4EF5qSX74np4J4H/tiIc159pYz\n7ftcbq1Vp6enXfTGdH8uwuXhc8nTFvDxHssNFx9bHhxh7e3t9YwDAcCg3eq7edly6nn/fL54Zcf9\n+/c7Ppj/pDRgPF/L1+j0tqJV8sEyRp6bnAH0mrxSSnfQX8tZ5fg/S2S+5XQpf29dTweqZaCGMExq\nvw5mCMNszHxCNnVVUmdYiGFuU2IYnWyTF08Tv1oYluWkUR/CMOn/J+9dQm1b27y+Z8y197qdvb9z\nvlgiZflBQag0yk4ZRAQ7QhomdsRO0IZKEigbJSjYSLQTIRSkEUtII0KJYgIaERQiwY4RQxC8UAmF\nWlVICjRYRUWhvnPZe601122ONNb6jfUb//mMOefe55xd69t5YTLnHJf38lz+z+V9xztqcq686Wc6\nSvswLO1Dbhlj+nt9T/Y123IwsWSz+J1r44xhnrFgR32OOxuZ8nMIhhnH4TnbCOzDMGfV3R40SAxz\nH7jeGGYZWpIRF+TKbfpcylraynQ8KcYwxn98fDzZi7RH2XZXnl3YmB1Pp8fg0glT1tU5Ts4+pPHm\nPs+b8/GCdPqQXjC/u9JlNTwmK5oFxNGCDbTvXdrZnXo9DZYL6imO0MimZJTqklMdXOfUvXnga9zP\nJSFNxWbMtEmGysBLu3ZMma6FB0sylo6e+8b5BB2P9ebmptbrdTuejHg8RuiR05KdHGG8urGkbC1F\ndhnJ8Z1ARPFaDerI+rzYmSCjy+Dxf1/E94NYlnRlH4b5Oq7xfbswzFMqeV+HYRhmy5flaMkB9Bg7\nnXRdxjB/qp6yx76X9oxhWZju7DAsZR65y+mkHKOv7xzepLvLkoPcnbcemB7GMPjINQ7eyE7aaduH\nYdmW++TxpsO4C8M8lhwHpcOwxD02Q7XNzL5kFnGfw8V3OnvuV5fg8LVkcemTp5BN4xxzS6edZz9Q\nQakwDp3TBBMcaXHc36m0KGASyJF81fyJKv+velh4d3FxsbXOwX3z95KwUa+Njz18xg2I2IlDwXKh\nnX9nxg8a4VQ49e+1FI4yDcodrTnufpneWY/7ybRjgqEBzHRLQLAx6RZv0k+/w9GPi9N/xuwxUr+v\nSXkxLXlQwNfQL7Ka5n+OL50b+uhIvAsAxnGsy8vL6YnN5A3yuQRM6YAtGVQb28ykuE3rFUYPmrMW\nBZ12Pfsivh+0Av87+vqaDsMSy9Iw7sIwT28lBiaGvX37dgvDuiCMkjJMn4xh6XTTFz8lbMfGOMAx\n92EJw5y9SgwzXRLDXI+du8RW09v1ZJBLcGvs5Vyn4z5HP/h4XRtTe8YwptZtD9wuGGbaZ3bFPHH2\nHvvTYZhnZsx/19HRdR+GuS+JYYzNMwLYZ8se8pJZ9X0YlvzZh2HgWGJY0nupPAvHahiGKRLPDFAa\nF4qJZILmLqomnKPlYRhmjxPb4FJI0do4O9LgWGaKLPydgPMh5YtwW2E6x+329naaMrSiuR3WJeCA\n0RevQbJjAlARsXQRaNU86vM4uCaBynRx/zLbk9FT8t4gXlWzp5YYL2BBYR0CY6SPVlqDtMeVvHSW\n0fLkBx9S1lar1WyBfEa+OWb3AYfEDnP27+bmpt6+fTtbA2A6p7xzfxrRdK6S9hTrpeWuy/7BI48f\nRxdZd3DwsZSvg2H85jvX7iT4+/ru/X12KMZxbDGMkuunfG8aNLdLISD24uiq7TVm0IInDxPDLIsY\n/sQw8Op9MSz3CewwbBfe2YEAF7qHRzxeOyvGMNupDsOY9uswzGPtpujBHNOhwzD61WWWjGHdTujp\nYBgDd2EYv6+vrycMywX6Dk72ZYt2YZivM+Za7vxJDMPeGsOc/NlVng26ZaSE4Ga2p2qeFkxHh/ur\ntoHBzo4VBwYa8FlA2HnbaaC8nsDtpbF1Zsjj8H2OIuwE2BEhe5XRIx8Uy9FIRj5W+ouLiwnsLKAe\nH/0zT6zc0NcA4z4nrfmf9O2iUPjhqQIc03wa5fb2dlqvkDKxNB1IP3JadBgeXvTslDA065SRa8gk\nkBG7urqaFmWyANXjMH2o/+joaNozJnnC2J1x47x3q045NSDzP8+7OOCAN0vFznLuuMzTqvnako+t\n2HhapvZhGMV6uZQ9Nf264MrOyN3d3bSeKjGsap6Rsi7zfxeG+Th18d8ZqXTQLSOeRvd19MMGlvGm\no8HxfRhmOiZPTO8u+DBmW875b32mX/5PMYbRT4x3Yth6vW4xzE9LH4JhVU/Zr8Swztm3LHhtGv2B\ndu+DYS7vgmHud9qZXRgGTWzXE8Pyessna8+q3h3DngXKJZEgRnqdS9d3EXo6MFbQZCR18UHYl9p1\nG52BzX45EvJ0TedlG4yhgRcbJrhlfxifz6Gcnj5LGuQ9ftqwqmaRWedQeByOfDzmXGvQ0Z4xmo7d\nN8qbdXlKF753QNsdo6/pIGZGLkvnaENT6snpV87znTw1v5faxJAwHjvTyR+Pu8tAZPSWtKKPmUJP\n41r1xANnElgQnbz9mEpmSd4Fw1yHf+fSBvO7q5MPmZ19zjN9rVp+GiwxDP3onBhjmB2szIakg9bV\n4/ucwQbLOL4Lw2xUd2FY0ijpnevVdtHejkaOJ4ObXVnEDsOS7jlmHFvLojHMQWt+PJZ0lOgXfEjn\nPOs1b3LK1Lw1hnHMCQGXxJm0ObswzHKZvOjqztmXYRgmn8B2bKk8C8eqajsFbnBOg5SCYEZ3BsoE\n9BM2VhSYyaOsnibyQtw0SiloHo/75DUF1AUAWgFIAeNYeZ4559Z93JHYMDztE8L8cK7NctTke8Zx\nnFLArnNJWRO8nS5lDBnxGah30RA5yHObzaaur6+3HB1Hg3xct/lnRSQDCIDZgDhVbp6mIlN37hHj\num5ubqZpmQQv18kxUuoJNIyJdQoGuQ5o/e0+Lcmtr2edh7MISyDtjCpyxGPjrCMB+J0x+BiK5Zjy\nLhiWeNEFguZJ7vPWYZj1wzhhOaPtXDhuw02fljAssyfgAs6VccuOSj4ow8cZe2NYZor8xLPvGcd5\nJoj6d2EYdbqf9C0xzNhpPV/CME9BUjabzexdib42p/ISw+hr0t9BYWLYEtYmhq1W2/tcuS7eBbnk\nZHQY5l3XE6vW6/XUHueNYZ2Tm/X4OvdjH4b5/sQwaMR4oQdLcfbh17PYboFC+rBq+7U0/qYs/a56\n2tCrW2yWwnV0dDQZvfRYUeC8l99W0l1TlQmWMDcXTnaKaS/bjEdIuimBqgclPT4+nqVWfd3d3V2d\nnp7OUvI83osjcHp6OrXD/QZ82jfouXSOSOftJ6hbuRBk92Oz2czWOXmthZUx6Ue9Vij33QYDYOAe\nQIp6uJa+5ZonrjHtoftms6nz8/NJRrnf4E3/2MYgaYpR4FU5FPph49Q5WP5v3jJ2991l6fhms5k9\nqs8Yrq6upjEkkH5MBV14Vwwzn1x2YVjiUodhNjrdUgt+p15l3zsM4/8hGNY5NH4I5l0wLB0BY1jV\n0557yD8Y1tHX9eS6IPeBa607Xfa6wzDXlU+mwYcuE5dyYp2zTJnuziR2GAbvjGF2GsHxfRhmp/v8\n/HyS+SUMu729nZzjxEKclZwyZO2Vsbvj31Jw0tGtO95lFrtNWd8Vw55VxiqNdlW/OM3H815HHXnf\nkoOBE2HAsSL7+hQMSkZ2GMSTk5NpjjuzRql8u5wQO1QoAoB1fHw8gU/ntOR0QkZOBqUcJ9d00UvW\n7zUmtJfjdd3pmCaoWfBNp0OyhB2Qmwbut+mT9dvJMxA6qk3Hkzq7xb/8J+vm4wbdjAS7KcpxfFrw\nat46w2VZcv9Ms4wyM6Kzge74Zhqm4eN6r8MDwD+28r4YlrQ/FMN8b4dhnkLq2s+2fQ68AVtYvOup\n5nfBMPTbzuWhGGYcWAowuj6lbnEMPXPWwbrs/hsvDsWw1AlKh2GZyeycS9ftvrqNDJyMX4nlfBsn\nrJO7MCzl2xt5Gje4P/ndPcXYve2kC9QTwxLjk2aJ21nHEoZlBrbqKZOILHaOusuzyVhBpJxzZoAG\niW5ASdj09tkB2FNvMO/LL7/c2iNkyXBznx2cYXjaxI+CB29G+H6Os6jQezF5YSeGkr4TheE9AwaA\nlB0B+kwk5v7RFzZG4xFZpiFTIOmPgc9OGTTPF153Cm+HxoJOW6ZdgmbV9vSgleTs7GzqD9kcg6DH\nzm+yLOmwIY+O4pzdswz5Nxkp+J77oaSyQreOphxzJoRofxgepn0+++yzqd/cyyL5NOSmlYE0nSl4\n3dGFkkDsDEQ6pNfX19Ojy4z9Yy0dhlXtztr6GLKSGIZ+m6/I45s3b7Y2zl1ypCwn7ltimB1iZzVo\n1xjGuPdhGNeAO86iLGFY1VNgkdk1MnVgGIYa+iG7/OY9hHYoquavCPPTw++DYYzXeyIdgmGUs7Oz\nWeDk7MghGJZ8h7bui9f/2cFawjDTzHwBw05PTxcxzMGns/zQ6+bmZms9ItcYT3I2IftC277eD1Ek\n7dJp5jq3aTqygD3fTNKVZ+NYQWR7jShD55n6vkz3ZWTva6mb67w/VeeppmHi/qOjo8loezqK6zrP\nOZnlMbrPThnbictokd9eHE6fOW/wo5/pDPh6hJFrLNCbzWZKu/MaIITQRt9jSx7YKeiEF6XmPONn\n7N6zinbziUH6YANkZ8/8HIahzs/Pq6qm8WQdmb0xbU1jjInr94MHjC/bZ4dfdv3lOhsHgD9foQMQ\nsFO1HbUEiF1GdSlg6SK9lNsuKuwiOoxeTm1+TCUNv7FrCcOqaktOOszzMWPY5eXlDH+sU6lfiWGn\np6czDOscgQyuOj4nDu/CMI65T14cnpiEnCWGuS5f7wCQc9YlMIz3qlY9LXSn7+Zf8mwXhnHMgRi0\ngH65Pg7d9XpVzwKY32mbGCPLCiwHjAOHk3oSC9NRWuKN+enzSxjmAMH934dh0MX95l6K+5Dy3dlZ\n0yv5tYRhvp6y2Ty9f3JXeTaOVVU/d+xsTzoUS8Y5he/k5GQiGIw7PT2dduS2sNnBskDQDo9cUrej\nxC7T4ggQwfFYqdvjsDAZkJy6dlt2QhBQjvt1JkRiHdjk9VU1e9zWSux+LaWilwTfDnQaDpQ3+Wyn\nANpA1wSezO6QMWKqxO1V1fQKD2hgfuc6CmcYrYTJL5zSdL7SgfF/yyWAYicLQziO49bGtldXV9Mr\nIrqAoOOPHaxd1yWw2Sk3b+BngjbnoBdy8zGus+rAuHOiEsM45uvfBcO8BUHnRIM5SxiWU9DJKwoy\n2PWX3+mMcV+HYW4LfQHDfJ2dJGMbmGt9pA3jWeeIVNXehcjvg2FLAZx5YszChiS2geMcczYu6X1y\nclLX19fPAsOQVbI6tgcOEL3UpsOwtOker/mQxzremR5dNi0xbCkYMW/y+Fb7i2c+cHGERcnoKUun\n1GZMVf+YLAT0PhWdkcm+AUbJeAsg11tQKX7810BiMErlB2hyLt6bmxqYrOiOwBh/B4xOE9t4+rdT\n/uYNYNZF5xm5mNZJn+TdLuUyX7prso8GLxeAC1ry9KMjzCzwydkxAB8euP1ct8bHaxeybmjEMa5L\nHTEwJf0NjpalfMLJbXPfrkxLB95LwY2/Xcgwfqylw7ClkhhGyexPGnC+eSfjUh/yu8Ow5Funw/x3\ntsgY5oDrEAyz3NpRyaAq8TJl1wFe9hu6Wea7TANjSofo62JY0jN5l7zit/Us+2n6Qh9n7MGiD4Fh\nHYa8C4bZ4V3CMNtI6lgK5m03OgxL2nYYljzr+EN/l+xO1QGO1TAMf2UYhn83DMO/0LE/NwzDrw7D\n8POPn9+vc39mGIZfHobhXw7D8Pv21e8CEy3EJoKZaqL6ejsKqfD2qN++fTsztk7t2rN98eJFnZyc\nTG/g5lqN94GQoYD20L3w2B6vXwDqez2OqifHgG0gEEKDFLQDUPwoMwrDS5N9rKpma18cEZHNo76c\nFoN+RJjj+LRrMtGSBRC6Qi/3mXEYRJMm/AcsuS43CcV4eN8aOxWnp6d1fn4+rc+AfvlY9FI0Z0Ci\nbmhNtNYB7y5ng3bZmJb+W57s8I7j05vlN5uHx5a9VoLz8KJbvJ8AS+mcfYN6Or58PJVhXmf9ufne\nt10+FIYZdJPO3SdlPDHEzgb1GMNYVxVj3XJq3gXDEoN4yg7ZMtZUbb/a6VAMc1DI+Q7D+HQYZgxg\njKvVarZ9AvTqMIyn8JBddOvrYlg6m6YxvxPrwDCuA4+90XDV09Y/YBhPcZt+HwrD0kGk3vv7+2lq\n0I68HXH66HVZXt9LIfjt9KMbj2lsefV16eguYZjHm/V6/VxXDslY/dWq+o+b439hHMefePz83cdG\nf7yq/lBV/fbHe/6HYRgO2rAmB9k5TMlIrs/z/s6nEJgSSgGkpLfNGgQvvuuyQ06b22BZiZNhbJtP\nP51ZsgePg4CC2dNGGJLJgI5T5NSdjhX97VL1CcQ55eOMD3U5Ver6nALnetLSXdaP9tLR8nQrNDTA\npqxknaenp5PCmpbmu0ExHRqPhzFiBK2kL1++rOPj45kjDIh1Cuvj19fXk7OU0VUWDERea1q4PetW\n6oz5sAtE01B0ANz1let3RXvfQvmr9RuIYd01++rwN9MqFJwHT/+5ZFbjXTDMv5Fbv/evw7B8rc2h\nGGYHfQnDXM8ShhmPEnN2TQkxnjS4qW/vi2GdQ8C3lzIsYZjxOR0lMCzXxXnM3xSGsV4zMSzb9TQs\n2Lxer+pIqGsAACAASURBVLcWe3fYfH9/P72c2bxJDFvCrl0OvXnhdjsM63D5fcreNVbjOP4fwzD8\n6IH1/YGq+hvjOF5X1b8ahuGXq+p3VdU/2nejHRAilsf2Z9dZae3JO+OUAu56Xr58Wd///vdbQ2WF\nwiB6Lw0+/EeI/ERh1ZPz4RQ0KVsD4pLHawGEHh0oGmQAQtOND1FXOnC8ZNLp9k8++WS6x8qY/bMR\nGSLisqJ5Ma8ziVZA8422c/E41zn7x/mUGzt6XmOATLx9+3amqCl/FDt0rHnwIlSPyWs9LEur1Wra\nxDOjRgOgQdCR03q9rk8++WRGfwOg19oxRrffBSb8tjHqrlkKPDxtknxIAO1kJ+n8bZcPhWE21Kkj\nLqY/8sP/98Gw7IMNPvqwD8PMD+SKYoPvjFPV+2NYjjMxLJ0czi1hmJ2RQzCMvrmv19fXdXZ2NtPN\nfRhmbDKGQVvTdR+G+fwSjZGJN2/ebC0n+NAYZhnv6AwuXV1d1atXr2a0d6COrbX99NiNN243MczH\nfcyy5PsTp5YClSxZX1e+zuL1PzEMwx+tqp+rqj89juPnVfUjVfWPdc2vPB57p9IRIJnWRQFcx73d\nokQLTWc4dqVv7QlTRxpuiqfGcNCqnoQt06w5to55gBOe/dHR0Sxa2gUeKBX15HhQaGhOKtq0T6D3\n/6UsjPveOVUcS+Vx9GCjwH+eSuwUPZ0KznkstGuDBp3MP+pLkOyMZmbq3A5tmf8pu13dvr5bH2Uj\n2TlXNmhdv7t0f67psc4knakvd+6mb53hdX9+g8s3imGmzyEYljzpeHQIhmVB3pYMc4dhHf4wlUyG\n3xhGXR2G2bjlOeSxqrYwLPE2+47xp559GOYF+mkv3E7izhKWGsOc2ekwLO1LBkDpmHV9yuDDGFb1\n9ALsD4VhHFvCMPPIfSI4TgxLp8mZqnSiuiAxHSOXJQzzeJP33SxWxwPGuQvD3nfx+l+sqn+/qn6i\nqn6tqv78u1YwDMNPDsPwc8Mw/NybN2+m4/aK3XEPxMRwcaoY4+t6Xrx4UVdXVzOFoD7XwTHApYsM\nrDDM+1c9rEu6vr6uy8vLevPmTa3X62kjyCWvOw1prlVBkcg8cQ3teN0W92TdCUir1dNCTs75kd/N\nZjN76SQRYU77JU1QPgrKBIAa7Fy8Uzgg0Ckuv6E56wFyfxH66+lN/nMta8u8boMNXeErkbKj35zO\ncLRtxTO9TQucVkfinRGCD7y6xiCU6y4sX77f7aexX5LDjLJzTD5OHxOQ4KWNOPc9E6fqG8ewjobv\nimHpMKCjHYZRT9I+p1O8lvMQDAOzLi4u6quvvtqLYSlj3XsKHVhgaHl91+Xl5ZZj7oyRM7uui0wV\ndIHubtubM2MfljDMbRsz+A8/cid5ijHM9TDuDNoTwxgP9RrD0nk05nFvh2HGpl0YhqPTYZgxmHu9\n35jrp5g2SxjmKUZjWDr+tut2tLKkfLuOzkFz4GEcW7KdhzpVVe+ZsRrH8d9qMH+pqv7Xx7+/WlXf\n06W/7fFYV8fPVtXPVlX96I/+6JiGMw1FeqC+tmrbgOXO6fzvnkYahod1CF5UixCZ8Tyu7/VLrIVh\nrVTOWds7p9hR6iI5RyuAnaOoZCzTlYyNhZx+LJ+9N0ynbv0Zwmdh9uL2FFiDnMHLi1qhicHeoEyx\nIi9lYEw/+slrFTabzZTNq6rpEWRPQbBYlTp4LyIAYZqZLqaNaWUH3WBs/qSTTDvpeOR1BgCAiT1g\nPAamTzxOy7331KH+zqCkU5YgZj44M9xFgPmS3H2g+KHLt4FhPpcYVrW8v94ShhEopHwZJ8ybXRhG\nsGEMo4+8Dw3HgKnDXRhGWcIw99POoeXG8kabyM3d3d2EYc7QOLvlDBZ1dhjGeI1hbt8YZl13IOjp\nzEMwLNuB9ksYxhQkGMb5DsOYBcEO3d7ezraM6bKc+zDMTrbvga7+ttPrwJJrluhiDLMMQF9jmGXj\n6Oho9n5V35dYluPJ4N/FbXQZLS8z6YLGdKxd3suxGobhh8dx/LXHv3+wqnja5u9U1V8fhuFnquq3\nVtWPVdU/PbTeJJAFf9cguL6qZoS3YK9Wq+lliulNHx8fT4+smikWQIzharWqr776aorKnCL1S0FR\nJgQlHZg0Vjay7rcjXxtGOz3pLDIWRzO0iSI7C+VxVtWsz7SzWj08icLj3TyN4owWkdRqtZrtsM0Y\nnQEyiHZ8T6NgIGQc0CmfqCESYo+qjEAM1oyBejAkbsf/T05OJiOWhs00NM+Rj1z7AIhZjtIp8728\n9yyjOsuq2+6M+NJ5y0HnKNHnNIjw0XTI9Hm2f4g+f9vlQ2NYYsBCn6pqGcOOjo7q8vJyxjvaZJ1K\nYli2iZ7ytglkzxmld8GwDCCMYZRco+Txug3fkxjmp9Rs2HPaye1z3Bh9cnIy0fD4+Lhub2+nup1Z\nB8OGYZits/V+UodgGDR9Xwxjj6qkH9kf2ntfDLPOZ2Yw+ZoY5tkA7xH4TWEYbbve7pzPJ4btcsRs\n33Kdave0rfXKvOrKXsdqGIb/uap+b1X90DAMv1JV/3VV/d5hGH6iqsaq+tdV9ccfB/MLwzD8zar6\nxaq6q6qfGsfxoFWqCQYJHB0juoLjYIdqHMcJdJI5WeeSQ4fz8Pnnn892uE5ie7E1gkz72Tb95GPQ\nsMPlVKQNMoDozzg+vfrGymvBtKIhIKYDGS+O5330j+jR/c3fbtuRtpUjDXgCFPUYnHDQnM6Fpn5K\niSje9QGcfvUF9HNq3PJD3fSHp126qK+TsV3AdXJy0q47SqO12Tw8afP69eutqYUubd+VDvS6azv+\ndI5BN24HDnn/ksH/NsuHwjCXbwrDHvtfVU/OxhKGWQasU8aU4+PjCcNSdxxY7cIw1+1sBfdlxqSb\n6nGf7DAtYRgZLOMBWQ7rMIUMVefgODOSGGaa2hkBd7sZjyUM87HMdDEGPuaDMYyA1ttGVFWLYabl\nEra/K4aZR+lUuN6Tk5OtXduzHmh5e3tbr1+/noJay4nvSYzoHCQ7Rz6ev7v6fCzP2YnMwOgQDDvk\nqcA/3Bz+yzuu/+mq+ul99XbFXmdOk3RedGcQUAAL8TAM0wLM9Gg9z7skWCcnJ7Ver+uLL76YGTT3\nMxf05Zon98lRKMWbVVK3ncJxHGc7cjNOKyXnjo+PZ96/5+1dr2lGfYANYGieeIdnvwusE2CDOmCb\nqViEFyCxM2vnyVGhQZ/6nXmzshIJe9rD0Tl9sCwwrpcvX04vGLVjZYPj1y+wrsE0hdZpuPjtcXZO\nth1b+nt7ezubErG83tzcTFMKFDvRHks6VJajjPKy2Fmmr5lxpXRO3K66v43yoTAsA4avg2HWWY6R\nLTYvjTfGMMtdVU2Zj8SwYXia+jsEw6pqqx364i1MqM9OYdUTzqGTSxiWW0z4v/XKxj4xzEbX/WBc\nNzc3W4/z8+FhH/roh39cdmEYdEm7Ywwzvzn/rhjm9oxhnvrtMKyq6urqai+GQfOU0XSavMZ1H4bd\n3NxMjrIx6fb2dspo2YlO3EgnL+Uy+5Z65kxm1dP6ZXC4W+S/r06XZ/FKm/T8rKzpGVOskJleZk42\no5WqJwFhDRCPD1sJARDO//qv//p0rzcVxbB26wosiAahdK4c0dgpcoTIuOzM0DavukAoaI/r2DTP\n1xigWIgInRNASPfiSNgZMEB6bMmndASdwWEsXWSTTx9ZyXNNEdfwbXnACUmDQrGTwtShF4zSJvxP\nMKh6WAsBiL148WJ6/2D2xTQyHZyFZE+qTvaHYaiLi4tpg0DaAJRev349jcH3UDf0dbFDlM6W21+K\n+BwM+DqDoKO+dMQ/tmLc+ToYxvSQ5btqvnYpAx4bMHQ3MczBAU/WIruufwnDkFvrJNcPwzDb1DGn\nhTMrYQxbckSXMIzxO+sChnmHdXSZ8dooev+3LtthfMFZScdyF4Y5iDa9GIf573reBcOGYZitH3Nm\nvMMwZ2IsM6w3rZpjGNdajsFgB2Fu9+7ubmZXjHlVVZeXl7XZbOr8/Hwa72r1sMfkq1evtjBsV7Bn\nuczM/y4ny84vGNbRhv++t9Nnl/d9KvAbLUseoY1QAjGMyAXDHZB1QG7wqdp+zBRBv7y8nDks6dG6\n3l0OooW6YzbfPt9FSBk5MFan36GFAdCb/FEPYzCt/AhvFx10ffZY8PwzcjFfsr/dGLOvKQ82Ju5P\nRi+cS8NuJTTIeuwZaaVh6dql7evr60W+QKe8j8IUhuWQ/sB/p913yXfVfFqD/x29fZ8DgcxQua00\nhjlOl+TBx1psSL8OhqXsmE8cq5pP4XF8F4ZRl99z6r67dBhmfeZcp68dhnX4ZVzI486S5ZOGHkNi\nGGUXziw5937CzWNLR2vpCWfToJMFdIt2EmffBcOcecHxSpomhqV97ALixDDbaPqw9CBY1ROG0YfM\nLFU9YVgGDlmXf6cz6OMODKnPbbrvLktysGSjuzqyPIuMVdW2g9LNcVLSoOA9e9DU57l9DD5Te1k3\n9ZJC/fLLLycHJKMUg9KSkc1oZGlRL5GKhY9xpPIm4DhTxXHu82PGpoGn81AOMmUsSvdiUafeTbNd\nDqLH0CkI15mOtGFl8Xl4kUpjsGCvHWfQPH7TF3ojC143t16vt6JnFpFaoRO4ud8bwZ6entbJycks\ni2q5SZ6zaJVpUD8dZmfHU3/WBR5o4JinTRz5pZHqdIx+2Wgn2KehtQykHOwDpI+lbDabaUF51dfD\nMDtF0NoYlrwjC31zc1Nv3rzZiWHU+64YZpnlvJ/c4hjySOG8jXtimO/3k4HGMLe7C8MYQ5d9BUfI\nrHj8plPKvPlHf3ZhGFnB1JUMDJcwzL87DKuqLQyresgKdRjmepEXlyUMOz093XqRfcqeadJhmK/B\nWWYRPfyAJ9Yd25+OH0kby6F53Y0znaZsI/93Y87ybByrNFhW6ASlJFAX1edcMkQ5Pj6e1s5kO4Ah\nuxpnqtvG3WlcM8315VSehcX96lLvnEM4AF1HOlVPqWzS5VXbu5XTNvTx1B6KjsJklsIOKf2gb+ZZ\nGmnTnGuSH0krp+kNQJ72y5KGussmJV29LsIROMDD2HMxpqfrTBPOWeEst+v1ekpxs7Fpght99BQk\nhiGNLfRhR2ODkmnm69NwuF3kogMnX2O58P1LRtm/uzo/1pJG530xzDzxZx+GnZyc1K//+q9Phuvb\nwjAbJWMYfc81Wx7XIRhGG/zehWFVNXuyzmukdmFYl4U3DdKxNG557RRj8nKJDuPsOGWQ5UCoC15c\nwDAHv4dgGImGxDDz51AMW8J9O6qJYc6obTYPWzCwU37SwnTo7EzyrTtvvEnnjG/ToXOaXK/72PVl\novPimd+gYgHK6Dojvo5IzvDADAt7txaByGgcx/r8889nkYUdrDzuPnWG0oYoFdUOA4LfKY8Fworn\nOt2OAYkFglZSL4CvegK1dH5ubm5mxjmnLFzG8WlDT65z+thjzighs39c5/82ULRH4VrzgXvPz8/r\n6upq1qazgsfHx1NUd39/X9fX17NpzI4n5i0g5enblF/fc3FxUavVw1M+NjKWJegHH/wSVoM7tHzz\n5k29fv16uv7+/r7d6sK86o7ld0Z+manAQOSaM/Ml6/N4TZuPqSxFuu+LYRzL9Y0c932JYensGJOq\ntvfnWXL2l77pq/dJ8zXOlnMMOti5SefBuHZ9fV2np6ez7E7uAQeG2RHk4ZPUwSUMq9peD2pczMXM\n/m8MS0e1430X/PHbDs6hGMb5zWYzwzDX2wVUjNn2zH3qggFjGLxPucG2QQ82PnWg/y4YlsVBR9LO\n/c+MXwYYwzBsYVgGhZ0upwPalWeFbkn4zril920hs3Pg/1U1GUKOuz7+80buLElcih0PX+tsUUYj\nVj7aZ9qOj6cE6N/Z2dl0nt2E2V2Xdp2SNk26xZlO/3pdVNWTMBvgOlrY8U2vvpsqTUNg3rjvVqau\nbYDPvEtnzSDGWAB0O3y8ADX5kn1M/juLlutIvKjThTFeXV1NAN7RxVFutpsONRuiekwJ8F3/LZfd\neNPApiO0FLF1Mp/n0jB9TCXBex+GWY6XDAJ1VdWWrHENvEsMS2OZMm0c8LXp6FhWLF8YmiUMc98w\nxrlruJ94swOYOJ1jSexbwjCPJXnRrW+j5NN7GYynvrjvDrY6+4D+G6s8NsvEPgy7vr6e7V/W6bAL\n/bYjagfYfNuFYVXV2tQOw2wnkpdgmK89FMOSL7aZnSPlOpYwjOs759f/l+6tekYZq/TsYa6/M+r1\nvTZUCJ9BHA86QZ97Pv/88ymVi9ds8LBykg5HKFEiO4ZVT2sHYDZPK3btA0480ZJG3k/AeU0CL8eE\nNgYIdrl1GpprnamqmguroyaivAQmt2EemCeutwM4R2YG8QQyxtZNv5nGdmhJiVfV7DFop+KZfoTe\nOR1Jf3J8zuDYucr1X11WBll68+ZNHR8fz7ZHyCcRoQHH4IPXDY7jU1RvutPPjtY+llOsGYmlcbCT\nlYuJPT4Dl/XV8vUxFuvTIRiWhse8BcMyc+192WwEv//970+45ECF+v2dD+1YDz2GxDCyM++CYW7L\n+mwMM6YYw9gC4JvGMPf/5ORkkX/+7dmANPocS1vBNcYwFzJjpje/V6vVtETDPF/CMNsj8zExzPaJ\nb/PuXTDs5cuXdX5+vhfDGCN8yIylMWwpCDGGmTe7MMxj6RIFHYblWN02xzJAyfIsHKv0PG0gHflU\n1czIULjP88cmPv8NZPZsv/rqq5kjRWrQ00ImIsCSDkDuieJHeVEAdnm3AFdtz+VT+G/nMLN0KRh+\npY2dPiuLhQPnDBCnP/5tJUunycLr680fj8cOr+vrvvPDce+1lX20vCBD9MHv49psNvXpp5/OnGkb\nmnRWq55AyHSH104RZ9RmkKdfbPVxdnY27d2SJeXWU7nwiIX2WYfXQrhvCbSW8ZSrNFo2JLuivQS6\nffd8TAXavSuGEXyZfmnckXkeR0cWCQyh8RKGwQsMs+V1CcOMn3d3d18bw9LAu307fmS49mHYarU6\nCMO6wM/FAatx1h/66ym0rM/Yz/+U/cQwOwiHYhj0+Oyzz2bveE3s6jAs6Y2NSodyH4bd3t7Wmzdv\ndmJY0tPrUeER07ZfB8MonW20I23ZTL5wzdfFsGfhWKXnZwWwMiZBuLdzLuxhpvKjfKvVqt68eTOb\nH+e8p6OG4WmLe7fLk3Movh0uGG5jzXgs5E7zZibOWThnSZwxq3rahykzGyi3BRPBIEJJZw1wt/Pg\nuhOgTKMUxHQ8fdwKsXQ++WnlWJoC9TWMASNi0PQmmzwd6cWu6fxBF2+4161lSOfT9MiF/xznNRTn\n5+czfneOzmazmTYBpK5xfHiKkXUK7k/qjPWlA5oOdKw/Ptf9X7o+7/kYHaw0hhR0ZheG8T+dDctD\nBhyJYciH8YiSxojibJCn06yjmWnZh2HoBucOxTCP0xiWxtVjIuOzhGHmh3Wu45OdPcZg59f3eBze\npsWGN9cHdXaN4u1w9mEYWUNj2O3t7bSx6PtgGH1OpzjleAnDmII+OzvbCiAOwbDN5mFK8zvf+c5O\nDDMtMzOV+sT9HMuM0xKm8f11MOxZ5OMtSC72UvfdDxPzKZZkSmYUvDGeo0wfq9pOSTqFa+BxFGNw\n8ifr77xw04Soxmt3rCymVzfnbfp5PQNRZzoyGaml0TTom/ad0tGXLjJwex636dIpFoBqPvi/70ug\nNE87BTNYWMGgE20RNaaM7VO8DAhslLzfkBfOVtUWABqUk85LJem41D+3k85Xx4/kbQJUtn9o1PeD\nVjpwN9bsKzk9l/VSd06p+Q0BSxiW+nh09PROPAcnXP+uGGa86hwE606HYaabpx6tjxTjhfWikzfL\nnGnBJ7OJqVepB67b/chZEtMx9Yd27Pyx1qzDMNfXTfHaeaJv5l3eeyiGLdE1MYx77+7u6urqaqKh\nHduuvlwvuOREZUmbdAiWHIqLS2PNa/e1+SwcK0oyLJ9Eqlpeg5MKYIcIoPGxu7u7yct3nQiDHRQL\nAulpQM0pX0cZjMcGNKMH7qE9K6ujEAx7RgBWDO9bxaJ+Us3+VNVMsdxHO2+Am5XEQOHrkkcGeIOm\ngTmBPMGaOrnOC/ZNR4wDsuF2eHUCdXnNCus6DNie3oAWGCCn/h1pw4OTk5PpesZhA1H1tPDTNPET\nYOM41sXFxcQ3GzjLU8qQ73VWYBzHGXh19F2KTjun2td0xpv+OnvoMSwZ/o+hdM6kHapDMGzJCBtX\nOgzLp2o73aReLxOgjW8CwxzUJYZ5RmAJw8BA9NxYZmeiwzDbCfSWermWfiWGeVxLzkU6yXyMF4dg\nmB8+WsKwzPRhA6jL2blDMAw5gC7vimHOAtK/DsOMwWBY55hBJxzixO63b98ejGHpfHfn0x9wSVzi\nmkMxbFd5No6VwTbBxcSyYqbS+7+LAR8mYXStNFU1LWAHDEi38oi8Bcv9sBC7DwiwU/WsWzAAoOhV\nNYteUqC5BiVgfJw3HUkv0zdnmDzPndkfxtVlpDJdnnWn0eyc41QIg5WBFn6P4zjto8IeLSkDdk6h\ncRbADH7Qh9PT09kLW1N2qDONYSojfcZAeIzOrLke0wc+vnnzZnL+MiPpyDSNXy4aXtKbLkPIf99n\n3XM//DCA7+vqoi+eNrXD9jGVxCrLyC4M43cGKRk47sMw+oB8gwlMp7FPVGIYwWcGVZSvi2HGQreb\nGJYGf7PZTE5Fvh7FGFY116+cvjsEw1y3A3Ho2WUuTCfbIQe37gOvjGHq3zLAvd7UtMMw09EYdnZ2\n9huCYdyX/Xv79m0dHc33JoOuHYb5XtaP0c/uWs8WLeFW6p7v7+wS9+bvJQzbVZ7FGquqbcNr4ljp\n7S1nZOdiAKrafioKIiUIuRBhcD4VzIpogTg6OpqBg/uUv9PIEIlaKbk+Fx26Dr/ktKqm9ToGQ5TX\n4JkOSSqcHaUEXDt+XbTn+rLYwGf62/U4wkwaOkLnJdt+zNryUvW05oFxuN6XL19O6yUAYtoygMFX\nR8GeNnG/TWdvZJh05B7qevHiRV1cXNTR0dG0uN5Rsdvyol36amMFj0yPjl/WuaRvd01GcV1k6N/Q\n25Hux1aShkmX5IUDwc5wIwsGc/MwMQxj67oSw1LH0oHKwJB+UL4JDPM6oCUMu7m5qU8++WSGYaaB\ndQtHxhhWNd+jCYdyF4a5WB/Nq6SdpxL5nXw/BMPo3z4Myyk/18vGsciF+/ttYViH7bSZGJZO7vti\nmK/tgrsljLHD7HssN98Uhj2bjJWF0AP3ACxgPkZJJpsAVjgU3Irt1N8wDFvp2q4v2VY6MVX9nkaO\nPu20kSlzv6jbdVGHBds0MxgCOsfHx9O3aZXfKF/n5afhNd19D7RMoXedqRwZXbhN0w9DAg99Xf7O\ntSpJI8bqVLmvs/O5lInripUUWtjJz+k/aOOxIhvs8ZLFfDGd3a/OUaVkILN0TRfZ+p50xrvr6Vca\ngo+t7MIw49AShnW86vQPXHLw1hl9dH0fhln2HGAm7hyKYYmtS3Wl7JtmmY0iKwaGmT77MAyHxzTM\nsgvDOp1YwjDjhLHZzssuDEujvwvDPFZPjXqcHwrDLNdpZ/10vPuezhPtvQ+GJY3Mg85O+l7T5ZvC\nsGeTsaqqmWB2UUTV9iO9S0YBgYI4MHYYhrq+vp4IlYrDo8R2UNyvDqR83OcszGl48MKd7jX4uAzD\nw67KFtgEP94QP47j7HUDgCup+ZOTk9naKz8Z6P1cPLb08rnHEVvyzIpEP/0/H6P2NakUaaTsBLuO\nXGtCXeZzrh9Ix9zj9tM+ySvGaL7nQlgKkfLp6enEW++KnjJtkHr79m29evVqMiaZcYIf3HtzczPt\nK+M1Jt19/u9jpoflNwHIOpKRLiWj7eTpx1SgRze2BPKq5aemKMYBG/lhGKZpfl6PZCNtDFutVrNH\n8Q/BMAdmnS5+ExiWbVc9GevNZjOb4mR6jLVIp6en0xoeMmAdhjE1btry7em6JQyzI2Eb4vPIdPd+\nv6Qb9aAvxjDGvWtxeodhaQO5h3PfFoZ1Do4zgvR3s9lMO6t73VXW70X0+zDM/OzqStnNpIrpmrYl\nf/taxtjRPMuzcaw6jzejgu6eBB++ERgDP0LMh5dM4oDgdFF8v+t3apnjmU5NQ8T+HF4sT5+yXYqd\nl3TeUrGghY9nVgPnI4vBmqmDqqfpMQtSLurmWOdEdWsd6BcGgWjGxnnJ8YFnNtTw9O7ublq7YGeA\n6Vna9R5WgA7tnJ2dTfXRdztu7g/8t8wCAnaabIgcgdu57TKRbpuU+tnZ2ewp1iz0KcHGIOB+dDLA\nNe43xwxm/F6KuBPM8vc+YPpBLMiIx7YPw+wwZUlMcZDnqT+uwXHByNuZMjbyndiYWRXLQdW7YRh1\n2TAuyZ5ly1NMKSedzJmOjJ2sFjrZYRhOGv3rMIz+WxeMTWARr//qAl7TFEenwzB4+XUx7Pz8fKr3\nfTEMGu/DMF4yTr3OQCWGvX37tj799NPpRc6d7QYHE8M6PLMcWZZTnvjfFQfqeaxqnrXzmDLz15Vn\n41i55ECyWBBgUAKBCeTslt8IT7Hj4nn5pUK7OUVlQU3DxGaQCCzRHtezc64dTKdHPUfeOXUAbCfc\nrB2i3iVBQvG9wJP601E0H7jXSuo+WKlpvxP6rDsjFBw6L6S1sBPpGkDMWyJUT1ng5DBOIl6iRyuf\n+2MZhDZeg2f5MB19/9HR0Sy7aCAzSIzjw+J9jIHlKo2B2zZ/DfwGr3SmUiYMWgk65pN1tltfmBHg\nkqPxg1w6nqRDQ9mFYZkZROcTwxIDoH2Hmx29aQedMpakQ11V0zpGR+3GMDJlmYHlfhyKfRjW4Q3Z\noc5RTQwzju7CMPph/hnDMohIm0Sbzvr4/NHR0dZeYu+DYWAFGThjGPcnhjGWbxPDaLdbrtBh2OXl\n5Sy7nvqSNiJtyS4M6/yF1L1MkNg/SAxzQOP6MsBcKs/CsUrCJqjYMJthOZ/MYLsIkDpZx4QSAwZk\n2lSAbgAAIABJREFUAjqDg9A4EnSx02NPHcF3BEDdRDkuToW7DQOQx5NTLADK0dHDbty3t7fTNFLS\nBCB3Zs9RjjMpKINB3n33YkP3LwEsoyXolmDrCMw8gY52jJyF4xi/oRnOFdOh+bJl2vQTh84i8T+j\nexszG0baRXa4zhlF2jS97dy4QIu3b9/WZ599tuW0UzweHsWm/gSyDtiW2l4yyt0aN4NXGqYlJ/pj\nKOmI+tguDPOShS57lDpftYxhdtJdLGeZseZ6OxT0cQnDkKvEsHEcpyy2DTQBW9LHWO+6wZfEsJQj\n+ruEYej+Eoa5/Q7DcqG7cQkaOGOUuOX6bbiNYeiRX1Hjxet2ilgnawyjHcaP82v74EXq1JX4lJkr\n88rrtIyLtI/dyqSCC8ffvHlT3/3ud/diWAbH9GsJwzjm724sxif4kPdnENkFPPvKs3Cs7A0zoBTy\ndLrszTvCQAAsxDDHxtQZAwMd/XExkWnXAGZlg1mO/MwQK6XbsddvgMvUPHWkwpsuNoa5CZv7Td9M\ncxwM5ritjN7hvVPcpbn/NCaOILmP3ZUTFM1HG5OMHjJLMwxP7+9jOoC6me5cr9cTGDuatDyyHo/6\nAHiiSkDQjuMwDJMzm2l30wk+eEGvpwAyOrq/v68vvviifvNv/s0tPaEZr05yG51zZNl0XzGECVDQ\nvZv+66LBdLY6GfxYio1+4pDP87tqPj2+ZMCr5lutWF8Tw3KpQBod35dTPYdg2JJTSKGf7n9mnmlv\nKfttbEgMW5LnJQx79erV7HqcE2OYMSjHZP1zAER9vs4YBl/GcZw9KW6H2EFH8sEyxP12qqqeMIy1\naMYw1/Hy5cu6vLyc1efd2jebpw1mD8UwnFc7//7vtVbmGzz44osv6od+6Ie2skGJYfRzH4alHUaW\njGH53WGYPz5u7HO7u8qzcKzSM7ShtABnNsMZHoNY3u86EESY53ad/usIR30ZUXGPQcVPQthBYL7f\nqXcDqNugn6YL/QVkESIWqW82D3u/fPrpp7PXRKDYGF3q76YYecwZJaHPVU/rOLz+q2puLLrsXQI9\nfYd+VTWBiKN2O1SOqswjItJxHKd3TjHFx4s9DYzec8e0tbK5z3bs0ilC+d2XdD4Zqzf+dDYM+jkr\nZic6AeOLL76o169fb9E5o7HT09MtQKAtG/k0wBk4pEPgazMKdB0+ZhDNoOljKNA81xLtw7AukLAh\n6n779S7OBKEvKUMu7o8xzIZvCcNoZwnDPGa+jWHcD32MYeP48DJk+nF3d7eFYTgut7e30/5IuzAM\nelfVDMNwrr4Ohjn48tSpMYzrCMD42Hlxezhn1LtaPUyvOmNUNcewdOitZ56e3IdhHd+41/01pph2\ndq68aSv9TQz76quv6tWrV1t4aby4v7+fZGJfcJa2xdekE7vLcVrCsMTCxO8se7dbGIbhe8Mw/INh\nGH5xGIZfGIbhTz4e//eGYfh7wzD834/f3308PgzD8N8Pw/DLwzD8s2EY/sN9bUCMziONvmwRvx3U\naj6dyDdETOeFujMKMrEzsnDK1cC5VMwcp73tBLpd06MzwjlejwHhdvYKEAR4c3NUO6Ep5KajhdYp\n+O6+pHk3DoOsx9EZbH5TX07X5X15vemVzgKGYmmqEfqxKaOdYWjgp4zSsHXK7cgf2uKAuaSc39/f\n19XV1WxDQPMls0/ZjktGaUvH6IcNOcesFynnXf8P0Zdvqnwo/HJZGt8SuPtb/V7EsKrawjBfn1iy\nhGE8vOM2d5U02qmjbjdloZtWc7FRX8IwZ+aYPrNR/qYwLMds2i1hGEGf8SR5537swjA7MsaqXRjG\nB8eTT4dhXiQPL2mP/uTsSdLQzhr32aHMmZLE5M1ms4VhaS+cvbccmVau8xAMY/zZt45f7pPtsse5\nVA7Zx+quqv70OI4/XlW/u6p+ahiGH6+q/6qq/v44jj9WVX//8X9V1X9SVT/2+PnJqvqLB7QxE/qO\nSHkcj9YOSDIkjaefQEtiWWlgpiMa6r25uan1el3r9XoS2IwQrRBWyFT0FBK34ykvQMbbHLgNP1LM\nKxP8mgg7f4DAMDwtgk0vHYWhzzl3zji99suRsuuiZBQHrXPM9Bn+OqLA8TDoUgdjPj09rZOTk2lX\nZ8ZDVHl9fT2tpfJ6EBwmdninPxmdMxYvtK16mMpdr9cTbWmfHa+9u7NBlXtT3nNfLcZPP66vryfn\n2KBgMLIDhxwZvJZ0MOs0Lxmvo3RPsXOtnSr3n9

Thanks @lamberta, updated.

yongtang

comment created time in a day

Pull request review commenttensorflow/io

Move Dicom's documentation to docs/tutorials (tensorflow.org/io)

+{+  "nbformat": 4,+  "nbformat_minor": 0,+  "metadata": {+    "colab": {+      "name": "dicom.ipynb",+      "provenance": [],+      "collapsed_sections": [+        "Tce3stUlHN0L"+      ],+      "toc_visible": true+    },+    "kernelspec": {+      "name": "python3",+      "display_name": "Python 3"+    },+    "language_info": {+      "codemirror_mode": {+        "name": "ipython",+        "version": 3+      },+      "file_extension": ".py",+      "mimetype": "text/x-python",+      "name": "python",+      "nbconvert_exporter": "python",+      "pygments_lexer": "ipython3",+      "version": "3.6.3"+    }+  },+  "cells": [+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "Tce3stUlHN0L"+      },+      "source": [+        "##### Copyright 2019 The TensorFlow IO Authors."+      ]+    },+    {+      "cell_type": "code",+      "metadata": {+        "cellView": "form",+        "colab_type": "code",+        "id": "tuOe1ymfHZPu",+        "colab": {}+      },+      "source": [+        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",+        "# you may not use this file except in compliance with the License.\n",+        "# You may obtain a copy of the License at\n",+        "#\n",+        "# https://www.apache.org/licenses/LICENSE-2.0\n",+        "#\n",+        "# Unless required by applicable law or agreed to in writing, software\n",+        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",+        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",+        "# See the License for the specific language governing permissions and\n",+        "# limitations under the License."+      ],+      "execution_count": 0,+      "outputs": []+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "qFdPvlXBOdUN"+      },+      "source": [+        "# Gradient Decode Dicom Tensorflow Operation Example"+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "MfBg1C5NB3X0"+      },+      "source": [+        "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",+        "  <td>\n",+        "    <a target=\"_blank\" href=\"https://www.tensorflow.org/io/tutorials/dicom\"><img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />View on TensorFlow.org</a>\n",+        "  </td>\n",+        "  <td>\n",+        "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/io/blob/master/docs/tutorials/dicom.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",+        "  </td>\n",+        "  <td>\n",+        "    <a target=\"_blank\" href=\"https://github.com/tensorflow/io/blob/master/docs/tutorials/dicom.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />View source on GitHub</a>\n",+        "  </td>\n",+        "      <td>\n",+        "    <a href=\"https://raw.githubusercontent.com/tensorflow/io/master/docs/tutorials/dicom.ipynb\"><img src=\"https://www.tensorflow.org/images/download_logo_32px.png\" />Download notebook</a>\n",+        "  </td>\n",+        "</table>"+      ]+    },+    {+      "cell_type": "markdown",+      "metadata": {+        "colab_type": "text",+        "id": "xHxb-dlhMIzW"+      },+      "source": [+        "## Overview\n",+        "\n",+        "This tutorial shows how to use [dicom](https://github.com/tensorflow/io/tree/master/tensorflow_io/dicom) in TensorFlow IO for decome DICOM files with TensorFlow."

@lamberta Thanks. That was a typo. Updated the PR.

yongtang

comment created time in a day

push eventyongtang/io

Yong Tang

commit sha b06e8bf11f6bac704208f9d73dcdba870d7df32a

Remove display image (will shown automatically) Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in a day

push eventyongtang/io

Yong Tang

commit sha a5318e2106355550591cd09a211c3ca48c69e420

Remove display image (will shown automatically) Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in a day

push eventyongtang/io

Yong Tang

commit sha 770d80c8f239b95903cea4117f7d5bfbda3dbfcf

Remove display image (will shown automatically) Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in a day

push eventyongtang/io

Yong Tang

commit sha 6139f18c6a243da632b9551f180b00ed56f495e8

Remove display image (will shown automatically) Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in a day

pull request commenttensorflow/io

Move Dicom's documentation to docs/tutorials (tensorflow.org/io)

@MarkDaoust @lamberta I moved the tutorial of decode_dicom (DICOM medical image) to docs/tutorial. Would you mind take a look and see if everything is fine?

yongtang

comment created time in a day

push eventyongtang/io

Yong Tang

commit sha 36a9e6d61c6f4a33e7c49d8d1db92d221a9d9074

Move Dicom's documentation to docs/tutorials (tensorflow.org/io) Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in a day

PR opened tensorflow/io

Move Dicom's documentation to docs/tutorials (tensorflow.org/io)

This PR creates a dicom.ipynb and moves the contents in dicom/README.md to dicom.ipynb

Signed-off-by: Yong Tang yong.tang.github@outlook.com

+321 -85

0 comment

3 changed files

pr created time in a day

push eventyongtang/io

Yong Tang

commit sha d75cdde5b641713be56e938aaf0f5173877c8935

Move Dicom's documentation to docs/tutorials (tensorflow.org/io) Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in 2 days

push eventyongtang/io

Yong Tang

commit sha 369c88efdf467f607bf9e45dca116da01b888c25

Move Dicom's documentation to docs/tutorials (tensorflow.org/io) Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in 2 days

push eventyongtang/io

Yong Tang

commit sha ec26972422a2874a0e1cb96968e2f453f66837df

Move Dicom's documentation to docs/tutorials (tensorflow.org/io) Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in 2 days

push eventyongtang/io

Yong Tang

commit sha 9cc9ab48925016f6ea7c6ad319538176e3e9b5bd

Move Dicom's documentation to docs/tutorials (tensorflow.org/io) Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in 2 days

push eventyongtang/io

Yong Tang

commit sha d031874cc1c7235b17e707072246b9defc79236d

Update dicom.ipynb

view details

push time in 2 days

push eventyongtang/io

Yong Tang

commit sha 23f13d1fb23ce7f749d2f5be5dfe60fa3f192173

Move Dicom's documentation to docs/tutorials (tensorflow.org/io) Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in 2 days

create barnchyongtang/io

branch : dicom-doc

created branch time in 2 days

push eventyongtang/io

Suyash Kumar

commit sha 3c64cf9d0f9ad9ef690300adfa98a5e2f764f87c

[Genomics] Add op to calculate Phred Quality Scores (#620) * Add ops to convert phred quality scores * Ensure dim of quality is set * minor cleanup * update API, lint cleanup * rm newline * lint * cast to tf.int64 * Add eager mode tests for genome * fix lint

view details

push time in 2 days

pull request commenttensorflow/tensorflow

Add `any` support for autograph with dataset

@mdanatg The PR has been updated. Please let me know if there are any other issues.

yongtang

comment created time in 2 days

Pull request review commenttensorflow/tensorflow

Add `any` support for autograph with dataset

 def test_filter_dataset(self):       self.assertAllEqual(self.evaluate(iterator.get_next()), 2)       self.assertAllEqual(self.evaluate(iterator.get_next()), 1) +  def test_any(self):+    self.assertEqual(+        py_builtins.any_([False, True, False]), True)+    self.assertEqual(+        py_builtins.any_([False, False, False]), False)++  def test_any_dataset(self):+    dataset_1 = dataset_ops.DatasetV2.from_tensor_slices([False, True, False])+    dataset_2 = dataset_ops.DatasetV2.from_tensor_slices([False, False, False])+    self.assertEqual(+        py_builtins.any_(dataset_1), True)

Thanks @mdanatg, PR Updated.

yongtang

comment created time in 2 days

push eventyongtang/tensorflow

Yong Tang

commit sha b5bf5c908634f7f2b0b10882d1896bdafb3f38f6

Add self.evaluate to the value of the test case comparision Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in 2 days

push eventtensorflow/io

Suyash Kumar

commit sha 3c64cf9d0f9ad9ef690300adfa98a5e2f764f87c

[Genomics] Add op to calculate Phred Quality Scores (#620) * Add ops to convert phred quality scores * Ensure dim of quality is set * minor cleanup * update API, lint cleanup * rm newline * lint * cast to tf.int64 * Add eager mode tests for genome * fix lint

view details

push time in 2 days

PR merged tensorflow/io

[Genomics] Add op to calculate Phred Quality Scores

This change adds an initial op to convert the phred quality score in a FASTQ file to a probability that a base was called incorrectly.

+203 -1

12 comments

5 changed files

suyashkumar

pr closed time in 2 days

pull request commenttensorflow/io

[Genomics] Op to calculate Phred Quality Scores

@suyashkumar The PR looks good! 👍 Will merge after Kokoro complete.

Add a read_fastq_dataset(filenames, convert_quality=false, convert_to_onehot=false) which calls the underlying read_fastq op for all the files in filenames but returns it as a tf.data.Dataset.

I think a place to expose API might be tfio.IODataset.from_fastq. We use tfio.IODataset as an entry point for exposing Dataset related APIs.

Write markdown documentation for using the various ops Explore if any further changes will be necessary to pass that dataset of ragged tensor into the tf.keras model api.

That would be fantastic! 👍

suyashkumar

comment created time in 2 days

pull request commenttensorflow/io

Add Kafka message key support

/cc @kaiwaehner @sbaier1 as was discussed.

yongtang

comment created time in 2 days

PR opened tensorflow/io

Add Kafka message key support

This PR is an enhancement for KafkaDataset to add an option of message_key=<False|True>. By default message_key=False which maintains the previous behavior.

When message_key=True is passed, the KafkaDataset will output a pair of message, key. This could be useful when the key of the message might be needed.

Signed-off-by: Yong Tang yong.tang.github@outlook.com

+71 -9

0 comment

5 changed files

pr created time in 2 days

push eventyongtang/io

Yong Tang

commit sha fb4640bbd2195a4af86fc9437b1b8135a7a75e7b

Support graph mode dataset usage of IODataset.graph(tf.uint8).from_ffmpeg (#622) * Rework on audio related test, use fixtures and parameters Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Add Audio support Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Add Video support Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Fix python 3 issue Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in 2 days

create barnchyongtang/io

branch : kafka-key

created branch time in 2 days

delete branch yongtang/io

delete branch : audio-dataset

delete time in 2 days

push eventtensorflow/io

Yong Tang

commit sha fb4640bbd2195a4af86fc9437b1b8135a7a75e7b

Support graph mode dataset usage of IODataset.graph(tf.uint8).from_ffmpeg (#622) * Rework on audio related test, use fixtures and parameters Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Add Audio support Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Add Video support Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Fix python 3 issue Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in 2 days

PR merged tensorflow/io

Support graph mode dataset usage of IODataset.graph(tf.uint8).from_ffmpeg

This PR is part of the effort to resolve the issue in #616 where it was not possible to run video dataset (ffmpeg) inside another Dataset (graph mode).

This PR adds the following option:

import tensorflow as tf
import tensorflow_io as tfio

filename_dataset = tf.data.Dataset.from_tensor_slices(
    [video_path, video_path])
position_dataset = tf.data.Dataset.from_tensor_slices(
    [tf.constant(50, tf.int64), tf.constant(100, tf.int64)])

dataset = tf.data.Dataset.zip((filename_dataset, position_dataset))

# Note: @tf.function is actually not needed, as tf.data.Dataset
# will automatically wrap the `func` into a graph anyway.
# The following is purely for explanation purposes.
# Return: an embedded dataset (in an outer dataset) for position:position+100
@tf.function
def func(filename, position):
  video_dataset = tfio.IODataset.graph(tf.uint8).from_ffmpeg(filename, "v:0")
  return video_dataset.skip(position).take(10)

dataset = dataset.map(func)


This PR fixes #616.

Signed-off-by: Yong Tang yong.tang.github@outlook.com

+1714 -597

1 comment

10 changed files

yongtang

pr closed time in 2 days

issue closedtensorflow/io

tfio.ffmpeg.VideoDataset doesn't work inside of tf.function

To be more descriptive.... I'm trying to do something along the lines of

csv_dataset = Dataset(....)
csv.flat_map(lambda filename, label: Dataset.zip(VideoDataset(filename),Dataset.from_tensor(label).repeat))

Tried using tfio.ffmpeg.VideoDataset

    nflux/amazon_demo/vid_extV2/video_tools/kinetics_dataset.py:88 _csv_to_clips  *
        frames = VideoDataset(video_path)
    anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/tensorflow_io/ffmpeg/python/ops/ffmpeg_ops.py:43 __init__
        super(VideoDataset, self).__init__(filename, stream)
    anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/tensorflow_io/core/python/ops/ffmpeg_dataset_ops.py:52 __init__
        shape = tf.TensorShape([None if e < 0 else e for e in shape.numpy()])
    AttributeError: 'Tensor' object has no attribute 'numpy'

When I use tfio.ffmpeg.decode_video(video_path,0) as suggested by https://github.com/tensorflow/io/issues/581#issuecomment-550132324

Traceback (most recent call last):
  File "/home/hollowgalaxy/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2963, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-3-54971d1eb051>", line 1, in <module>
    frames = decode_video(video_path, 0)
  File "<string>", line 849, in io_ffmpeg_decode_video
  File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.InvalidArgumentError: unable to open file: memory [Op:IO>FfmpegDecodeVideo]

Switched to using video = tfio.IOTensor.from_ffmpeg(video_path)._values[0].to_tensor() error similar to VideoDataset

        frames = tfio.IOTensor.from_ffmpeg(video_path)._values[0].to_tensor()
    anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/tensorflow_io/core/python/ops/io_tensor.py:430 from_ffmpeg  *
        return ffmpeg_io_tensor_ops.FFmpegIOTensor(
    anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/tensorflow_io/core/python/ops/ffmpeg_io_tensor_ops.py:92 __init__
        columns = [column.decode() for column in columns.numpy().tolist()]
    AttributeError: 'Tensor' object has no attribute 'numpy'

Ideally I would prefer the ability to load a video into a tensor. I was initially using VideoDataset because I was under impression that it loaded part of the video and not the whole thing. Edit: statement below is not true The first example works if I remove the tf.function decorator.

closed time in 2 days

hollowgalaxy

push eventyongtang/io

Yong Tang

commit sha e1fd4417e54f83a0b93d7dcd2115ccecd7b5e4b4

Fix python 3 issue Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in 2 days

issue closedtensorflow/io

Kokoro CI error

I notice Kokoro CI is returning an error for all build in tensorflow/io

+ readable_run wget https://github.com/bazelbuild/bazel/releases/download/0.29.1/bazel-0.29.1-installer-linux-x86_64.sh
/tmpfs/src/piper/google3/learning/brain/testing/tensorflow_io/kokoro/common.sh: line 26: \
readable_run: command not found

Also noticed that the same thing is happening to tensorflow/addons repo as well (https://github.com/tensorflow/addons#official-builds). (/cc @seanpmorgan )

I guess there might be some internal infrastructure change that caused readable_run: command not found?

/cc @kokoro-team @ewilderj @martinwicke

closed time in 2 days

yongtang

issue commenttensorflow/io

Kokoro CI error

Thanks @suyashkumar, great work and much appreciated! 👍 🎉

yongtang

comment created time in 2 days

issue commenttensorflow/io

tfio.ffmpeg.VideoDataset doesn't work inside of tf.function

@hollowgalaxy Added PR #622 for the fix.

hollowgalaxy

comment created time in 2 days

pull request commenttensorflow/io

Support graph mode dataset usage of IODataset.graph(tf.uint8).from_ffmpeg

/cc @hollowgalaxy

yongtang

comment created time in 2 days

PR opened tensorflow/io

Support graph mode dataset usage of IODataset.graph(tf.uint8).from_ffmpeg

This PR is part of the effort to resolve the issue in #616 where it was not possible to run video dataset (ffmpeg) inside another Dataset (graph mode).

This PR adds the following option:

import tensorflow as tf
import tensorflow_io as tfio

filename_dataset = tf.data.Dataset.from_tensor_slices(
    [video_path, video_path])
position_dataset = tf.data.Dataset.from_tensor_slices(
    [tf.constant(50, tf.int64), tf.constant(100, tf.int64)])

dataset = tf.data.Dataset.zip((filename_dataset, position_dataset))

# Note: @tf.function is actually not needed, as tf.data.Dataset
# will automatically wrap the `func` into a graph anyway.
# The following is purely for explanation purposes.
# Return: an embedded dataset (in an outer dataset) for position:position+100
@tf.function
def func(filename, position):
  video_dataset = tfio.IODataset.graph(tf.uint8).from_ffmpeg(filename, "v:0")
  return video_dataset.skip(position).take(10)

dataset = dataset.map(func)


This PR fixes #616.

Signed-off-by: Yong Tang yong.tang.github@outlook.com

+1714 -597

0 comment

10 changed files

pr created time in 2 days

push eventyongtang/io

Yong Tang

commit sha 255f7ba6c34a689008d06af300108f0159546dd0

Add Audio support Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

Yong Tang

commit sha 8c613773c282f2e1755606121be0cfea547e92ba

Add Video support Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in 2 days

pull request commenttensorflow/io

[WIP] [Genomics] Op to calculate Phred Quality Scores

@suyashkumar All tests pass now. Thanks for the Kokoro help!

suyashkumar

comment created time in 3 days

pull request commenttensorflow/io

[WIP] [Genomics] Op to calculate Phred Quality Scores

Also, it appears that the kokoro builds are failing due to #621. Since I work at Google, I identified the internal CL that caused the breakage in common.sh and can send a patch (will need to wait for someone internally to sign off before it can get submitted though).

Awesome! thanks for the help 👍

suyashkumar

comment created time in 3 days

pull request commenttensorflow/io

[WIP] [Genomics] Op to calculate Phred Quality Scores

Thanks @suyashkumar. I think python implementation would make more sense, as it is really easier to maintain in python than in C++. (We could always write a fused C++ version later, if the performance ever becomes an issue.)

I give a quick look at tf.data and tfio.genome. tf.data translate map function into graph before it runs (no matter if tf.data runs in graph or eager mode). However, since tfio.genome is already written in graph mode, tfio.genome more or less already supports tf.data.

There is only one change that needs:

diff --git a/tensorflow_io/core/python/ops/genome_ops.py b/tensorflow_io/core/python/ops/genome_ops.py
index bdfe13e..cbfe07a 100644
--- a/tensorflow_io/core/python/ops/genome_ops.py
+++ b/tensorflow_io/core/python/ops/genome_ops.py
@@ -84,5 +84,5 @@ def sequences_to_onehot(sequences):
         sequence_splits.size(), global_nucleotide_idx)
   return tf.RaggedTensor.from_row_splits(
       values=all_onehot_nucleotides.stack(),
-      row_splits=sequence_splits.stack()
+      row_splits=tf.cast(sequence_splits.stack(), tf.int64)
   )

If you apply the above diff, then the following code will work (in eager mode with tf.data).

# Note: works in eager mode.
import tensorflow as tf
import tensorflow as tfio

fastq_path = 'test.fastq'

dataset = tf.data.Dataset.from_tensor_slices([fastq_path])
dataset = dataset.map(tfio.genome.read_fastq)
dataset = dataset.map(lambda d: tfio.genome.sequences_to_onehot(sequences=d.sequences))
for d in dataset:
    print("Value: ", d)

Would you like to apply the above diff to this PR?

After this PR is merged, I think the next step is to see how far away to pass tf.data + tfio.genome into tf.keras directly.

Could start with converting RaggedTensor to dense Tensor first just to build a working keras model. Then trying to remove the conversion (of RaggedTensor to dense Tensor).

If there are any issue in RaggedTensor + tf.keras arise, I can help trying to fix it in tensorflow, or finding someone for help.

suyashkumar

comment created time in 3 days

create barnchyongtang/tensorflow

branch : ragged-tensor-error-message

created branch time in 3 days

PR opened tensorflow/tensorflow

Improve error message of RaggedTensor by showing data type explicitly

While working on writing a tf.data pipeline with RaggedTensor the following error showed up:


    def raise_from(value, from_value):
>       raise value
E       InvalidArgumentError: Expected splits Tensor dtype: 9, found: 3 [Op:RaggedTensorFromVariant]

/usr/local/lib/python2.7/dist-packages/six.py:737: InvalidArgumentError

It is not very obvious about the exact type that needs. Until found out in tensorflow/core/framework/types.proto that 3 is int32 and 9 is int64.

This PR enhance the error message by explictily print out the DataType in string, so the message will be:

E       InvalidArgumentError: Expected splits Tensor dtype: int64, found: int32 [Op:RaggedTensorFromVariant]

Signed-off-by: Yong Tang yong.tang.github@outlook.com

+3 -3

0 comment

2 changed files

pr created time in 3 days

create barnchyongtang/io

branch : audio-dataset

created branch time in 3 days

delete branch yongtang/io

delete branch : build

delete time in 3 days

pull request commenttensorflow/io

[WIP] [Genomics] Op to calculate Phred Quality Scores

@suyashkumar It is a little complicated, as genome uses RaggedTensor and there are some discussions about RaggedTensor with tf.keras (tensorflow/tensorflow#27170).

For the moment, I think you can just add phred_sequences_to_probability in this PR.

We may need additional follow up PRs to wire up genome with tf.keras and tf.data. I will do some more investigation in this area.

suyashkumar

comment created time in 3 days

push eventyongtang/io

Yong Tang

commit sha 56ec959ba334afdff1dabc0fa3b0aa19ad15a5ca

Add PBM(PPM/PGM) image support (#599) This PR intends to address the issue raised in tensorflow/tensorflow 31402 where there were no PBM(PPM/PGM) image support. PBM is not an efficient image format, though it is used in some places, most notably NYU dataset which consists of RGB+D sequences. This PR adds the PBM(PPM/PGM) support. Note as PBM(PPM/PGM) could be either 256 or 65536 so either upscaling or downscaling might be needed depending on desired output type. There are a couple of edge combinations that are not covered, though they could be easily added if test image is available. Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

Yong Tang

commit sha 98f52b669496602757ee801afa6b91fab041482b

Namespace update (#618) * Remap genome module to tfio.experimental.genome for namespace consistency Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Remove deprecated LMDBDataset, use tfio.IODataset.from_lmdb instead Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Map dicom to tfio.image.decode_dicom for API consistency Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Move avro to tfio.IODataset.from_avro for API consistency Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Remap parquet Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Remap hdf5 Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Fix macOS build failure Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Ping python-dateutil==2.8.0 to resolve macOS incompatibility Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Update genome to tfio.genome (remove experimental) Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in 3 days

issue commenttensorflow/io

tensorflow-io 0.10.0 release

The TF 2.1 release candidate was planned for 11/07: https://groups.google.com/a/tensorflow.org/forum/#!topic/developers/DK4QK25ViA4

It might have been delayed though it looks like tensorflow's r2.1 branch has been created yesterday. For that I believe TF 2.1 rc0 (or rc1) will be released next week. That means TF 2.1 final might be released in another several weeks (likely December).

Relate to tensorflow-io, I am thinking it makes sense for us to release a 0.10.0 before the final release of TF 2.1 (as we have added many new features since 0.9.0).

We could then release 0.11.0 at the same time TF 2.1 is released.

yongtang

comment created time in 3 days

pull request commenttensorflow/io

[WIP] [Genomics] Op to calculate Phred Quality Scores

@suyashkumar Also, I am not very familiar with FastQ and training/inference. Though looking at some of the tests you write, I think it might be possible to wire up with tf.data + tf.keras, so that models could be written in tf.keras easily for training and inference purposes.

Given tf.keras is the recommended high level API for 2.0, and tf.data is the recommended API for pipeline to keras, I think this could really help a lot of the users to adopt TF 2.0.

If you are interested maybe you could write an article or blog, I will see if I can coordinate to help promote or publish the blog/article to tf's web site +1.

suyashkumar

comment created time in 3 days

pull request commenttensorflow/io

[WIP] [Genomics] Op to calculate Phred Quality Scores

Thanks @suyashkumar! We are in the process of rework on API exposure. In the past, to get the API the following is needed:

import tensorflow_io.genome as genome_io

Now we updated the API so that it is possible to do the following:

import tensorflow_io as tfio
# use directly
tfio.genome....

To add new function in genome, you can add the code:

  1. Add the definition of phred_sequences_to_probability in tensorflow_io/core/python/ops/genome_ops.py

  2. C++ kernel ops is located in: tensorflow_io/core/kernels/genome_fastq_kernels.cc tensorflow_io/core/ops/genome_ops.cc

  3. Add the following line to tensorflow_io/core/python/api/v0/genome.py:

    from tensorflow_io.core.python.ops.genome_ops import phred_sequences_to_probability # pylint: disable=unused-import
    

Hopefully the above is not too much of a burden.

Once those are updated, new API are exposed in two endpoints:

  1. tfio.genome.phred_sequences_to_probability
  2. tfio.v0.genome.phred_sequences_to_probability

Note the above two endpoints are the same except we have both tfio and tfio.v0. The idea is to expose v0 to maintain API compatibility. When we release 1.0 we will expose tfio.v1.

suyashkumar

comment created time in 3 days

delete branch yongtang/io

delete branch : namespace

delete time in 3 days

push eventtensorflow/io

Yong Tang

commit sha 98f52b669496602757ee801afa6b91fab041482b

Namespace update (#618) * Remap genome module to tfio.experimental.genome for namespace consistency Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Remove deprecated LMDBDataset, use tfio.IODataset.from_lmdb instead Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Map dicom to tfio.image.decode_dicom for API consistency Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Move avro to tfio.IODataset.from_avro for API consistency Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Remap parquet Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Remap hdf5 Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Fix macOS build failure Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Ping python-dateutil==2.8.0 to resolve macOS incompatibility Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Update genome to tfio.genome (remove experimental) Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

view details

push time in 3 days

PR merged tensorflow/io

Namespace update

There are lots of file changes in this PR but really the core change is to remap APIs under tfio.v0, and remove deprecated APIs, similar to the last PR. dicom => tfio.image genome => tfio.genome LMDB => tfio.IODataset.from_lmdb Avro => tifo.IODataset.from_avro HDF5 => tfio.IOTensor.from_hdf5

+165 -1519

1 comment

88 changed files

yongtang

pr closed time in 3 days

pull request commenttensorflow/io

Namespace update

The Kokoro CI error is unrelated and is tracked in #621

yongtang

comment created time in 3 days

issue openedtensorflow/io

Kokoro CI error

I notice Kokoro CI is returning an error for all build in tensorflow/io

+ readable_run wget https://github.com/bazelbuild/bazel/releases/download/0.29.1/bazel-0.29.1-installer-linux-x86_64.sh
/tmpfs/src/piper/google3/learning/brain/testing/tensorflow_io/kokoro/common.sh: line 26: \
readable_run: command not found

Also noticed that the same thing is happening to tensorflow/addons repo as well (https://github.com/tensorflow/addons#official-builds). (/cc @seanpmorgan )

I guess there might be some internal infrastructure change that caused readable_run: command not found?

/cc @kokoro-team @ewilderj @martinwicke

created time in 3 days

delete branch yongtang/io

delete branch : 31402-pbm

delete time in 3 days

more